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 CreateNewSessionKey(WritableBuffer buffer, IConnectionStateTls13 state) { var lifetime = TicketLifeTimeInHours * 60 * 60; buffer.WriteBigEndian((uint)lifetime); buffer.Ensure(4); state.CryptoProvider.FillWithRandom(buffer.Memory.Slice(0, 4)); buffer.Advance(4); BufferExtensions.WriteVector <ushort>(ref buffer, (writer, conn) => { state.ResumptionProvider.GenerateSessionTicket(ref writer, conn); return(writer); }, state); BufferExtensions.WriteVector <ushort>(ref buffer, (writer, conn) => { writer.WriteBigEndian(ExtensionType.ticket_early_data_info); writer.WriteBigEndian <ushort>(sizeof(uint)); uint maxData = 1024 * 2; writer.WriteBigEndian(maxData); return(writer); }, state); return(buffer); }
public static void SendFlightOne(ref WritableBuffer writer, IConnectionStateTls13 connectionState) { connectionState.WriteHandshake(ref writer, HandshakeType.encrypted_extensions, (buffer, state) => { BufferExtensions.WriteVector <ushort>(ref buffer, ExtensionsWrite.WriteExtensionList, state); return(buffer); }); }
public static void WriteSignatureSchemes(ref WritableBuffer buffer, IConnectionStateTls13 connectionState) { buffer.WriteBigEndian(ExtensionType.signature_algorithms); BufferExtensions.WriteVector <ushort>(ref buffer, (writer, state) => { connectionState.CryptoProvider.WriteSignatureSchemes(ref writer); return(writer); }, connectionState); }
public static void WriteSupportedGroups(ref WritableBuffer buffer, IConnectionStateTls13 connectionState) { buffer.WriteBigEndian(ExtensionType.supported_groups); BufferExtensions.WriteVector <ushort>(ref buffer, (writer, state) => { connectionState.CryptoProvider.WriteSupportedGroups(ref writer); return(writer); }, connectionState); }
public static void WriteServerKeyshare(ref WritableBuffer buffer, IConnectionState connectionState) { buffer.WriteBigEndian(ExtensionType.key_share); BufferExtensions.WriteVector <ushort>(ref buffer, (writer, state) => { WriteKeyShare(ref writer, state.KeyShare); return(writer); }, connectionState); }
public static WritableBuffer SendHelloRetry(WritableBuffer buffer, IConnectionStateTls13 connectionState) { if (connectionState.State == StateType.WaitHelloRetry) { Alerts.AlertException.ThrowAlert(Alerts.AlertLevel.Fatal, Alerts.AlertDescription.handshake_failure, "need to send a hello retry but have already sent one"); } buffer.WriteBigEndian(connectionState.Version); BufferExtensions.WriteVector <ushort>(ref buffer, ExtensionsWrite.WriteExtensionList, connectionState); return(buffer); }
public static WritableBuffer SendServerHello13(WritableBuffer buffer, IConnectionStateTls13 connectionState) { buffer.Ensure(RandomLength + sizeof(ushort)); buffer.WriteBigEndian(connectionState.Version); var memoryToFill = buffer.Memory.Slice(0, RandomLength); connectionState.CryptoProvider.FillWithRandom(memoryToFill); buffer.Advance(RandomLength); buffer.WriteBigEndian(connectionState.CipherSuite.CipherCode); BufferExtensions.WriteVector <ushort>(ref buffer, ExtensionsWrite.WriteExtensionList, connectionState); return(buffer); }
public static void WriteClientKeyshares(ref WritableBuffer buffer, IConnectionStateTls13 connectionState) { buffer.WriteBigEndian(ExtensionType.key_share); BufferExtensions.WriteVector <ushort>(ref buffer, (innerWriter, innerState) => { BufferExtensions.WriteVector <ushort>(ref innerWriter, (writer, state) => { WriteKeyShare(ref writer, state.KeyShare); return(writer); }, innerState); return(innerWriter); }, connectionState); }
public static WritableBuffer WriteClientHello(WritableBuffer buffer, IConnectionStateTls13 connectionState) { buffer.WriteBigEndian <ushort>(0x0303); buffer.Ensure(RandomLength); connectionState.CryptoProvider.FillWithRandom(buffer.Memory.Slice(0, RandomLength)); buffer.Advance(RandomLength); //legacy sessionid buffer.WriteBigEndian((byte)0); connectionState.CryptoProvider.WriteCipherSuites(ref buffer); //legacy compression buffer.WriteBigEndian((byte)1); buffer.WriteBigEndian((byte)0); connectionState.KeyShare = connectionState.CryptoProvider.GetDefaultKeyShare(); BufferExtensions.WriteVector <ushort>(ref buffer, ExtensionsWrite.WriteExtensionList, connectionState); return(buffer); }