Exemple #1
0
        public unsafe static bool EncryptXtea(OutputMessage msg, uint[] key)
        {
            if (key == null)
            {
                return(false);
            }

            int pad = msg.Length % 8;

            if (pad > 0)
                msg.AddPaddingBytes(8 - pad);

            fixed(byte *bufferPtr = msg.Buffer)
            {
                uint *words = (uint *)(bufferPtr + msg.HeaderPosition);

                for (int pos = 0; pos < msg.Length / 4; pos += 2)
                {
                    uint x_sum = 0, x_delta = 0x9e3779b9, x_count = 32;

                    while (x_count-- > 0)
                    {
                        words[pos] += (words[pos + 1] << 4 ^ words[pos + 1] >> 5) + words[pos + 1] ^ x_sum
                                      + key[x_sum & 3];
                        x_sum          += x_delta;
                        words[pos + 1] += (words[pos] << 4 ^ words[pos] >> 5) + words[pos] ^ x_sum
                                          + key[x_sum >> 11 & 3];
                    }
                }
            }

            return(true);
        }