1
#include "source/extensions/transport_sockets/tls/cert_mappers/sni/config.h"
2

            
3
#include "openssl/ssl.h"
4

            
5
namespace Envoy {
6
namespace Extensions {
7
namespace TransportSockets {
8
namespace Tls {
9
namespace CertificateMappers {
10
namespace SNI {
11

            
12
namespace {
13
class SNIMapper : public Ssl::TlsCertificateMapper {
14
public:
15
1
  explicit SNIMapper(const std::string& default_value) : default_value_(default_value) {}
16
1
  std::string deriveFromClientHello(const SSL_CLIENT_HELLO& ssl_client_hello) {
17
1
    absl::string_view sni = absl::NullSafeStringView(
18
1
        SSL_get_servername(ssl_client_hello.ssl, TLSEXT_NAMETYPE_host_name));
19
1
    return sni.empty() ? default_value_ : std::string(sni);
20
1
  }
21

            
22
private:
23
  const std::string default_value_;
24
};
25
} // namespace
26

            
27
absl::StatusOr<Ssl::TlsCertificateMapperFactory>
28
SNIMapperFactory::createTlsCertificateMapperFactory(
29
    const Protobuf::Message& proto_config,
30
1
    Server::Configuration::GenericFactoryContext& factory_context) {
31
1
  const SNIConfigProto& config = MessageUtil::downcastAndValidate<const SNIConfigProto&>(
32
1
      proto_config, factory_context.messageValidationVisitor());
33
1
  return [default_value = config.default_value()]() {
34
1
    return std::make_unique<SNIMapper>(default_value);
35
1
  };
36
1
}
37

            
38
REGISTER_FACTORY(SNIMapperFactory, Ssl::TlsCertificateMapperConfigFactory);
39

            
40
} // namespace SNI
41
} // namespace CertificateMappers
42
} // namespace Tls
43
} // namespace TransportSockets
44
} // namespace Extensions
45
} // namespace Envoy