示例#1
0
        // Decrypt a private connect token
        public static int DecryptPrivateConnectToken(byte[] encryptedConnectToken, ulong protocolID, ulong expireTimestamp, ulong sequence, byte[] key, byte[] outBuffer)
        {
            int len = encryptedConnectToken.Length;

            byte[] additionalData = BufferPool.GetBuffer(Defines.NETCODE_VERSION_INFO_BYTES + 8 + 8);
            using (var writer = ByteArrayReaderWriter.Get(additionalData))
            {
                writer.WriteASCII(Defines.NETCODE_VERSION_INFO_STR);
                writer.Write(protocolID);
                writer.Write(expireTimestamp);
            }

            byte[] nonce = BufferPool.GetBuffer(12);
            using (var writer = ByteArrayReaderWriter.Get(nonce))
            {
                writer.Write((UInt32)0);
                writer.Write(sequence);
            }

            var ret = AEAD_Chacha20_Poly1305.Decrypt(encryptedConnectToken, 0, len, additionalData, nonce, key, outBuffer);

            BufferPool.ReturnBuffer(additionalData);
            BufferPool.ReturnBuffer(nonce);

            return(ret);
        }
示例#2
0
        /// <summary>
        /// Decrypt a packet's data
        /// </summary>
        public static int DecryptPacketData(NetcodePacketHeader header, ulong protocolID, byte[] packetData, int packetDataLen, byte[] key, byte[] outBuffer)
        {
            byte[] additionalData = BufferPool.GetBuffer(Defines.NETCODE_VERSION_INFO_BYTES + 8 + 1);
            using (var writer = ByteArrayReaderWriter.Get(additionalData))
            {
                writer.WriteASCII(Defines.NETCODE_VERSION_INFO_STR);
                writer.Write(protocolID);
                writer.Write(header.ReadSequenceByte);
            }

            byte[] nonce = BufferPool.GetBuffer(12);
            using (var writer = ByteArrayReaderWriter.Get(nonce))
            {
                writer.Write((UInt32)0);
                writer.Write(header.SequenceNumber);
            }

            int ret;

            try
            {
                ret = AEAD_Chacha20_Poly1305.Decrypt(packetData, 0, packetDataLen, additionalData, nonce, key, outBuffer);
            }
            catch (Exception e)
            {
                BufferPool.ReturnBuffer(additionalData);
                BufferPool.ReturnBuffer(nonce);
                throw e;
            }

            BufferPool.ReturnBuffer(additionalData);
            BufferPool.ReturnBuffer(nonce);

            return(ret);
        }
示例#3
0
        /// <summary>
        /// Decrypt a challenge token
        /// </summary>
        public static int DecryptChallengeToken(ulong sequenceNum, byte[] packetData, byte[] key, byte[] outBuffer)
        {
            byte[] additionalData = BufferPool.GetBuffer(0);

            byte[] nonce = BufferPool.GetBuffer(12);
            using (var writer = ByteArrayReaderWriter.Get(nonce))
            {
                writer.Write((UInt32)0);
                writer.Write(sequenceNum);
            }

            int ret;

            try
            {
                ret = AEAD_Chacha20_Poly1305.Decrypt(packetData, 0, 300, additionalData, nonce, key, outBuffer);
            }
            catch (Exception e)
            {
                BufferPool.ReturnBuffer(additionalData);
                BufferPool.ReturnBuffer(nonce);
                throw e;
            }

            BufferPool.ReturnBuffer(additionalData);
            BufferPool.ReturnBuffer(nonce);

            return(ret);
        }