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); }
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); }
public WritableBuffer WriteServerFinished(WritableBuffer buffer, IConnectionStateTls12 state) { buffer.Write(_serverSpan); return(buffer); }