Beispiel #1
0
        public IEnumerable <HelloExtension> GenerateHelloExtensions()
        {
            if (_endConfig.End == ConnectionEnd.Server)
            {
                yield break;
            }

            var suites = _cipherSuiteProvider
                         .GetAllSupportedSuites(_cipherSuitesRegistry);

            _config.SupportedAlgorithms = suites
                                          .Select(x => (_cipherSuitesRegistry.MapHashAlgorithm(x), _cipherSuitesRegistry.MapSignatureAlgorithm(x)))
                                          .Distinct()
                                          .ToArray();

            using (var ms = new MemoryStream())
            {
                var writer = new EndianBinaryWriter(EndianBitConverter.Big, ms);

                writer.Write((ushort)(_config.SupportedAlgorithms.Count * 2));
                foreach (var(hash, sig) in _config.SupportedAlgorithms)
                {
                    writer.Write(hash.Id);
                    writer.Write(sig.Id);
                }

                yield return(new HelloExtension(ExtensionType.SignatureAlgorithms, ms.ToArray()));
            }
        }
Beispiel #2
0
        public IState Run()
        {
            _versionConfig.Version = TLSVersion.TLS1_2;
            _randomConfig.Client   = GenerateClientRandom();

            var cipherSuites = _cipherSuitesProvider
                               .GetAllSupportedSuites(_cipherSuitesRegistry)
                               .ToArray();
            var compressionMethods = new[] { CompressionMethod.Null };

            var extensions      = _serviceProvider.ResolveAllExtensions();
            var extensionHellos = extensions.SelectMany(x => x.GenerateHelloExtensions()).ToArray();

            //TODO session id is not supported
            _sessionConfig.Id = new byte[0];

            var message = new ClientHelloMessage(
                version: _versionConfig.Version,
                randomBytes: _randomConfig.Client,
                sessionId: _sessionConfig.Id,
                extensions: extensionHellos,
                cipherSuites: cipherSuites,
                compressionMethods: compressionMethods);

            _writer.Write(message);

            return(_serviceProvider.GetRequiredService <WaitingForServerHelloState>());
        }