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())); } }
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>()); }