Exemplo n.º 1
0
        public unsafe static WritableBuffer SendKeyExchange(WritableBuffer buffer, IConnectionStateTls12 connectionState)
        {
            var messageLength = 4 + connectionState.KeyShare.KeyExchangeSize;

            buffer.Ensure(messageLength);
            var bookMark = buffer.Memory;

            buffer.WriteBigEndian(ECCurveType.named_curve);
            buffer.WriteBigEndian(connectionState.KeyShare.NamedGroup);
            buffer.WriteBigEndian((byte)connectionState.KeyShare.KeyExchangeSize);
            connectionState.KeyShare.WritePublicKey(ref buffer);

            buffer.WriteBigEndian(connectionState.SignatureScheme);
            BufferExtensions.WriteVector <ushort>(ref buffer, (writer, state) =>
            {
                var tempBuffer = stackalloc byte[connectionState.ClientRandom.Length * 2 + messageLength];
                var tmpSpan    = new Span <byte>(tempBuffer, connectionState.ClientRandom.Length * 2 + messageLength);
                connectionState.ClientRandom.CopyTo(tmpSpan);
                tmpSpan = tmpSpan.Slice(connectionState.ClientRandom.Length);
                connectionState.ServerRandom.CopyTo(tmpSpan);
                tmpSpan = tmpSpan.Slice(connectionState.ServerRandom.Length);
                bookMark.Span.Slice(0, messageLength).CopyTo(tmpSpan);
                connectionState.Certificate.SignHash(connectionState.CryptoProvider.HashProvider,
                                                     connectionState.SignatureScheme, ref writer, tempBuffer, connectionState.ClientRandom.Length * 2 + messageLength);
                return(writer);
            }, connectionState);

            return(buffer);
        }
Exemplo n.º 2
0
        public static WritableBuffer SendCertificates(WritableBuffer buffer, IConnectionStateTls12 connectionState)
        {
            var startOfMessage = buffer.BytesWritten;

            BufferExtensions.WriteVector24Bit(ref buffer, (writer, state) =>
            {
                WriteCertificateEntry(ref writer, connectionState.Certificate.CertificateData);
                foreach (var b in connectionState.Certificate.CertificateChain)
                {
                    WriteCertificateEntry(ref writer, b);
                }
                return(buffer);
            }, connectionState);
            return(buffer);
        }
Exemplo n.º 3
0
 public WritableBuffer WriteServerFinished(WritableBuffer buffer, IConnectionStateTls12 state)
 {
     buffer.Write(_serverSpan);
     return(buffer);
 }