An implementation of the TLS 1.0 record layer.
Пример #1
0
        internal virtual byte[] DecodeAndVerify(byte type, Stream input, int len)
        {
            RecordStream.CheckLength(len, this.mCiphertextLimit, 22);
            byte[]    array    = TlsUtilities.ReadFully(len, input);
            TlsCipher arg_34_0 = this.mReadCipher;
            long      seqNo;

            this.mReadSeqNo = (seqNo = this.mReadSeqNo) + 1L;
            byte[] array2 = arg_34_0.DecodeCiphertext(seqNo, type, array, 0, array.Length);
            RecordStream.CheckLength(array2.Length, this.mCompressedLimit, 22);
            Stream stream = this.mReadCompression.Decompress(this.mBuffer);

            if (stream != this.mBuffer)
            {
                stream.Write(array2, 0, array2.Length);
                stream.Flush();
                array2 = this.GetBufferContents();
            }
            RecordStream.CheckLength(array2.Length, this.mPlaintextLimit, 30);
            if (array2.Length < 1 && type != 23)
            {
                throw new TlsFatalAlert(47);
            }
            return(array2);
        }
Пример #2
0
 public TlsProtocolHandler(
     Stream inStr,
     Stream outStr,
     SecureRandom sr)
 {
     this.random = sr;
     this.rs     = new RecordStream(this, inStr, outStr);
 }
Пример #3
0
 public TlsProtocol(SecureRandom secureRandom)
 {
     mBlocking     = false;
     mInputBuffers = new ByteQueueStream();
     mOutputBuffer = new ByteQueueStream();
     mRecordStream = new RecordStream(this, (Stream)(object)mInputBuffers, (Stream)(object)mOutputBuffer);
     mSecureRandom = secureRandom;
 }
Пример #4
0
 public TlsProtocol(System.IO.Stream input, System.IO.Stream output, SecureRandom secureRandom)
 {
     this.mApplicationDataQueue = new ByteQueue();
     this.mAlertQueue           = new ByteQueue(2);
     this.mHandshakeQueue       = new ByteQueue();
     this.mAppDataSplitEnabled  = true;
     this.mBlocking             = true;
     this.mRecordStream         = new RecordStream(this, input, output);
     this.mSecureRandom         = secureRandom;
 }
Пример #5
0
 public TlsProtocol(SecureRandom secureRandom)
 {
     this.mApplicationDataQueue = new ByteQueue();
     this.mAlertQueue           = new ByteQueue(2);
     this.mHandshakeQueue       = new ByteQueue();
     this.mAppDataSplitEnabled  = true;
     this.mBlocking             = true;
     this.mBlocking             = false;
     this.mInputBuffers         = new ByteQueueStream();
     this.mOutputBuffer         = new ByteQueueStream();
     this.mRecordStream         = new RecordStream(this, this.mInputBuffers, this.mOutputBuffer);
     this.mSecureRandom         = secureRandom;
 }
Пример #6
0
        /*
         * Both streams can be the same object
         */
        public TlsProtocolHandler(
            Stream inStr,
            Stream outStr)
        {
            /*
             * We use a threaded seed generator to generate a good random
             * seed. If the user has a better random seed, he should use
             * the constructor with a SecureRandom.
             *
             * Hopefully, 20 bytes in fast mode are good enough.
             */
            byte[] seed = new ThreadedSeedGenerator().GenerateSeed(20, true);

            this.random = new SecureRandom(seed);
            this.rs     = new RecordStream(this, inStr, outStr);
        }
Пример #7
0
        internal virtual void WriteRecord(byte type, byte[] plaintext, int plaintextOffset, int plaintextLength)
        {
            if (this.mWriteVersion == null)
            {
                return;
            }
            RecordStream.CheckType(type, 80);
            RecordStream.CheckLength(plaintextLength, this.mPlaintextLimit, 80);
            if (plaintextLength < 1 && type != 23)
            {
                throw new TlsFatalAlert(80);
            }
            if (type == 22)
            {
                this.UpdateHandshakeData(plaintext, plaintextOffset, plaintextLength);
            }
            Stream stream = this.mWriteCompression.Compress(this.mBuffer);

            byte[] array;
            if (stream == this.mBuffer)
            {
                TlsCipher arg_7B_0 = this.mWriteCipher;
                long      seqNo;
                this.mWriteSeqNo = (seqNo = this.mWriteSeqNo) + 1L;
                array            = arg_7B_0.EncodePlaintext(seqNo, type, plaintext, plaintextOffset, plaintextLength);
            }
            else
            {
                stream.Write(plaintext, plaintextOffset, plaintextLength);
                stream.Flush();
                byte[] bufferContents = this.GetBufferContents();
                RecordStream.CheckLength(bufferContents.Length, plaintextLength + 1024, 80);
                TlsCipher arg_CC_0 = this.mWriteCipher;
                long      seqNo2;
                this.mWriteSeqNo = (seqNo2 = this.mWriteSeqNo) + 1L;
                array            = arg_CC_0.EncodePlaintext(seqNo2, type, bufferContents, 0, bufferContents.Length);
            }
            RecordStream.CheckLength(array.Length, this.mCiphertextLimit, 80);
            byte[] array2 = new byte[array.Length + 5];
            TlsUtilities.WriteUint8(type, array2, 0);
            TlsUtilities.WriteVersion(this.mWriteVersion, array2, 1);
            TlsUtilities.WriteUint16(array.Length, array2, 3);
            Array.Copy(array, 0, array2, 5, array.Length);
            this.mOutput.Write(array2, 0, array2.Length);
            this.mOutput.Flush();
        }
Пример #8
0
        internal virtual bool ReadRecord()
        {
            byte[] array = TlsUtilities.ReadAllOrNothing(5, this.mInput);
            if (array == null)
            {
                return(false);
            }
            byte b = TlsUtilities.ReadUint8(array, 0);

            RecordStream.CheckType(b, 10);
            if (!this.mRestrictReadVersion)
            {
                int num = TlsUtilities.ReadVersionRaw(array, 1);
                if (((long)num & (long)((ulong)-256)) != 768L)
                {
                    throw new TlsFatalAlert(47);
                }
            }
            else
            {
                ProtocolVersion protocolVersion = TlsUtilities.ReadVersion(array, 1);
                if (this.mReadVersion == null)
                {
                    this.mReadVersion = protocolVersion;
                }
                else if (!protocolVersion.Equals(this.mReadVersion))
                {
                    throw new TlsFatalAlert(47);
                }
            }
            int len = TlsUtilities.ReadUint16(array, 3);

            byte[] array2 = this.DecodeAndVerify(b, this.mInput, len);
            this.mHandler.ProcessRecord(b, array2, 0, array2.Length);
            return(true);
        }
 public TlsProtocol(Stream input, Stream output, SecureRandom secureRandom)
 {
     this.mRecordStream = new RecordStream(this, input, output);
     this.mSecureRandom = secureRandom;
 }
 /// <remarks>Both streams can be the same object</remarks>
 public TlsProtocolHandler(
     Stream			inStr,
     Stream			outStr,
     SecureRandom	sr)
 {
     this.rs = new RecordStream(this, inStr, outStr);
     this.random = sr;
 }
Пример #11
0
 public TlsProtocol(SecureRandom secureRandom)
 {
     this.mBlocking = false;
     this.mInputBuffers = new ByteQueueStream();
     this.mOutputBuffer = new ByteQueueStream();
     this.mRecordStream = new RecordStream(this, mInputBuffers, mOutputBuffer);
     this.mSecureRandom = secureRandom;
 }
Пример #12
0
 public TlsProtocol(Stream input, Stream output, SecureRandom secureRandom)
 {
     this.mRecordStream = new RecordStream(this, input, output);
     this.mSecureRandom = secureRandom;
 }
Пример #13
0
        /*
        * Both streams can be the same object
        */
        public TlsProtocolHandler(
			Stream	inStr,
			Stream	outStr)
        {
            /*
             * We use a threaded seed generator to generate a good random
             * seed. If the user has a better random seed, he should use
             * the constructor with a SecureRandom.
             *
             * Hopefully, 20 bytes in fast mode are good enough.
             */
            byte[] seed = new ThreadedSeedGenerator().GenerateSeed(20, true);

            this.random = new SecureRandom(seed);
            this.rs = new RecordStream(this, inStr, outStr);
        }
Пример #14
0
 public HandshakeHashUpdateStream(RecordStream mOuter)
 {
     this.mOuter = mOuter;
 }