Exemplo n.º 1
0
        public byte[] DecryptBlock(NewCamdMessageType type, byte[] data)
        {
            var channel      = (data[18] << 8) + data[19];
            var channelBlock = GetChannelById(channel);

            if (channelBlock == null)
            {
                _logger.Warn($"No valid block found for channel {channel}");
                return(new byte[0]);
            }

            var block1 = _crypto.AesDecrypt(data.Skip(24).Take(16).ToArray(), channelBlock.Key);
            var block2 = _crypto.AesDecrypt(data.Skip(40).Take(16).ToArray(), channelBlock.Key);
            var block3 = _crypto.AesDecrypt(data.Skip(56).Take(16).ToArray(), channelBlock.Key);

            if (!Encoding.ASCII.GetString(block1).StartsWith("CEB", StringComparison.Ordinal))
            {
                _logger.Warn($"Failed to decrypt block for channel {channel}");
                return(new byte[0]);
            }

            _logger.Info($"Decryption of channel {channel} succeeded");
            var key1 = block1.Skip(9).Take(7).Concat(block2).Concat(block3.Take(9));
            var key2 = block2.Skip(9).Take(7).Concat(block3.Take(9));

            return(type == NewCamdMessageType.MsgKeyblockReq1 ?
                   key1.Concat(key2).ToArray() :
                   key2.Concat(key1).ToArray());
        }