示例#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);
        }
示例#2
0
        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);
        }
示例#3
0
 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);
     });
 }
示例#4
0
 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);
 }
示例#5
0
 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);
 }
示例#6
0
 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);
 }
示例#7
0
文件: Hello.cs 项目: vcsjones/Leto
 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);
 }
示例#8
0
文件: Hello.cs 项目: vcsjones/Leto
        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);
        }
示例#9
0
 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);
 }
示例#10
0
文件: Hello.cs 项目: vcsjones/Leto
 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);
 }