Result Fragment_ClientHello_RSA(Fragments.ClientHello frag) { var serverhelloBody = new Fragments.ServerHello(ProtocolVersion.TLSv1_2, _params.ServerRandom, _params.Session, _params.Cipher.CipherSuite); var certificateBody = new Fragments.Certificate(new[] { new X509Certificate2(_pubkeyfile) }, false); var serverhellodoneBody = new Fragments.ServerHelloDone(); var responseFragments = _params.ClientCertificateRequire ? new[] { new Handshakes.Fragment(HandshakeType.Server_Hello, serverhelloBody), new Handshakes.Fragment(HandshakeType.Certificate, certificateBody), new Handshakes.Fragment(HandshakeType.Certificate_Request, new Fragments.CertificateRequest()), new Handshakes.Fragment(HandshakeType.Server_Hello_Done, serverhellodoneBody) } : new[] { new Handshakes.Fragment(HandshakeType.Server_Hello, serverhelloBody), new Handshakes.Fragment(HandshakeType.Certificate, certificateBody), new Handshakes.Fragment(HandshakeType.Server_Hello_Done, serverhellodoneBody) }; foreach (var f in responseFragments) { AppendHandshakeMessages(f); LogSessionInfo(f.Body); } return(new PacketResult(new[] { new Records.Handshake(responseFragments) })); }
Result Fragment_ClientHello_ECDH(Fragments.ClientHello frag) { var ecdhpub = GeneratePubKey(); var signdata = _params.ClientRandom.Data.Concat(_params.ServerRandom.Data).Concat(Fragments.ServerKeyExchange.ServerECDHParams(_params.KeyExchangeCurve, ecdhpub)).ToArray(); var signature = MakeSignatureWithCertificate(signdata); var serverhelloBody = new Fragments.ServerHello(ProtocolVersion.TLSv1_2, _params.ServerRandom, _params.Session, _params.Cipher.CipherSuite); var certificateBody = new Fragments.Certificate(new[] { new X509Certificate2(_pubkeyfile) }, false); var serverkeyexBody = new Fragments.ServerKeyExchange(_params.KeyExchangeCurve, ecdhpub, _params.SignatureAlgorithm, signature); var serverhellodoneBody = new Fragments.ServerHelloDone(); var responseFragments = _params.ClientCertificateRequire ? new[] { new Handshakes.Fragment(HandshakeType.Server_Hello, serverhelloBody), new Handshakes.Fragment(HandshakeType.Certificate, certificateBody), new Handshakes.Fragment(HandshakeType.Server_Key_Exchange, serverkeyexBody), new Handshakes.Fragment(HandshakeType.Certificate_Request, new Fragments.CertificateRequest()), new Handshakes.Fragment(HandshakeType.Server_Hello_Done, serverhellodoneBody) } : new[] { new Handshakes.Fragment(HandshakeType.Server_Hello, serverhelloBody), new Handshakes.Fragment(HandshakeType.Certificate, certificateBody), new Handshakes.Fragment(HandshakeType.Server_Key_Exchange, serverkeyexBody), new Handshakes.Fragment(HandshakeType.Server_Hello_Done, serverhellodoneBody) }; foreach (var f in responseFragments) { AppendHandshakeMessages(f); LogSessionInfo(f.Body); } return(new PacketResult(new[] { new Records.Handshake(responseFragments) })); }
Result Fragment_ClientHello_New(Fragments.ClientHello frag) { var ecdhpub = GeneratePubKey(); var extensions = new TLS.Extensions.Extension[] { new TLS.Extensions.KeyShare(_params.KeyShare.Group, ecdhpub), new TLS.Extensions.SupportedVersions(ProtocolVersion.TLSv1_3) }; var serverhelloBody = new Fragments.ServerHello(ProtocolVersion.TLSv1_2, _params.ServerRandom, _params.Session, _params.Cipher.CipherSuite, extensions); var serverhelloFragment = new Handshakes.Fragment(HandshakeType.Server_Hello, serverhelloBody); var encryptedExtFragment = new Handshakes.Fragment(HandshakeType.Encrypted_Extensions, new Fragments.EncryptedExtensions()); var certRequestFragment = new Handshakes.Fragment(HandshakeType.Certificate_Request, new Fragments.CertificateRequest(new byte[0])); var certificateFragment = new Handshakes.Fragment(HandshakeType.Certificate, new Fragments.Certificate(new[] { new X509Certificate2(_pubkeyfile) }, true)); // add [ServerHello] to list AppendHandshakeMessages(serverhelloFragment); // get (clienthello + serverhello) var clientHello_serverHello = GetHandshakeMessages(); // calculate shared_secret and HandshakeSecret (_params.Cipher as Ciphers.CipherSuiteBase13).KeyExchange(_params.KeyShare.KeyExchange, null, null, _params.ServerKey.Private); (_params.Cipher as Ciphers.CipherSuiteBase13).Calculate_HandshakeSecret(clientHello_serverHello); // add [EncryptedExtensions] to list AppendHandshakeMessages(encryptedExtFragment); // add [CertificateRequest] to list if (_params.ClientCertificateRequire) { AppendHandshakeMessages(certRequestFragment); } // add [Certificate] to list AppendHandshakeMessages(certificateFragment); // get (clienthello + serverhello + encryptedExtensions + certificate) var clientHello_cert = GetHandshakeMessages(); // get signature for CertificateVerify var signature = MakeCertificateVerifySignature(clientHello_cert); var certVerifyFragment = new Handshakes.Fragment(HandshakeType.Certificate_Verify, new Fragments.CertificateVerify(_params.SignatureAlgorithm, signature)); // add [CertificateVerify] to list AppendHandshakeMessages(certVerifyFragment); // get (clienthello + serverhello + encryptedExtensions + certificate + certificateVerify) var clientHello_certVerify = GetHandshakeMessages(); // get verifyData for ServerFinished var verifyData = (_params.Cipher as Ciphers.CipherSuiteBase13).GetVerifyData("finished", clientHello_certVerify); var finishFragment = new Handshakes.Fragment(HandshakeType.Finished, new Fragments.Finished(verifyData)); // add [ServerFinished] to list AppendHandshakeMessages(finishFragment); // before return, calculate ApplicationSecret // get (clienthello + serverhello + encryptedExtensions + certificate + certificateVerify + serverFinished) var clientHello_serverfinish = GetHandshakeMessages(); (_params.Cipher as Ciphers.CipherSuiteBase13).Calculate_ApplicationSecret(clientHello_serverfinish); // wrap 4 fragments in applicationRecord var plainPayload = new List <byte>(); plainPayload.AddRange(encryptedExtFragment.Data); if (_params.ClientCertificateRequire) { plainPayload.AddRange(certRequestFragment.Data); } plainPayload.AddRange(certificateFragment.Data); plainPayload.AddRange(certVerifyFragment.Data); plainPayload.AddRange(finishFragment.Data); // log info LogSessionInfo(serverhelloFragment.Body); LogSessionInfo(encryptedExtFragment.Body); if (_params.ClientCertificateRequire) { LogSessionInfo(certRequestFragment.Body); } LogSessionInfo(certificateFragment.Body); LogSessionInfo(certVerifyFragment.Body); LogSessionInfo(finishFragment.Body); var encryptedPayload = (_params.Cipher as Ciphers.CipherSuiteBase13).BulkEncrypt_Handshake(plainPayload.ToArray()); return(new PacketResult(new Records.TLSRecord[] { new Records.Handshake(new [] { serverhelloFragment }), // ServerHello new Records.ChangeCipherSpec(), // ChangeCipherSpec new Records.ApplicationData(encryptedPayload) // ApplicationData (EncryptedExtensions,Certificate,CertificateVerify,Finished) })); }