proxygen
BogoShim.cpp File Reference

Go to the source code of this file.

Classes

class  BogoTestServer
 
class  BogoTestClient
 
class  TestRsaCert
 
class  TestP256Cert
 

Functions

 DEFINE_int32 (port, 0,"port to connect to")
 
 DEFINE_bool (server, false,"act as a server, otherwise act as a client")
 
 DEFINE_string (key_file,"","key file")
 
 DEFINE_string (cert_file,"","cert file")
 
 DEFINE_int32 (resume_count, 0,"number of additional connections to open")
 
std::unique_ptr< SelfCertreadSelfCert ()
 
int serverTest ()
 
int clientTest ()
 
int main (int argc, char **argv)
 

Variables

static constexpr int kUnimplemented = 89
 
static std::vector< std::stringkKnownFlags
 

Function Documentation

int clientTest ( )

Definition at line 335 of file BogoShim.cpp.

References folly::INFO, kUnimplemented, and readSelfCert().

Referenced by main().

335  {
336  auto clientContext = std::make_shared<FizzClientContext>();
337  clientContext->setCompatibilityMode(true);
338 
339  if (!FLAGS_cert_file.empty()) {
340  clientContext->setClientCertificate(readSelfCert());
341  }
342 
343  EventBase evb;
344  if (FLAGS_resume_count >= 1) {
345  return kUnimplemented;
346  }
347  auto client =
348  std::make_unique<BogoTestClient>(&evb, FLAGS_port, clientContext);
349  evb.loop();
350  if (client->unimplemented()) {
351  LOG(INFO) << "Testing unimplemented feature.";
352  return kUnimplemented;
353  }
354  if (!client->success()) {
355  LOG(INFO) << "Connection failed.";
356  return 1;
357  }
358 
359  return 0;
360 }
std::unique_ptr< SelfCert > readSelfCert()
Definition: BogoShim.cpp:266
static constexpr int kUnimplemented
Definition: BogoShim.cpp:32
DEFINE_bool ( server  ,
false  ,
"act as a  server,
otherwise act as a client"   
)
DEFINE_int32 ( port  ,
,
"port to connect to"   
)
DEFINE_int32 ( resume_count  ,
,
"number of additional connections to open"   
)
DEFINE_string ( key_file  ,
""  ,
"key file"   
)
DEFINE_string ( cert_file  ,
""  ,
"cert file"   
)
int main ( int  argc,
char **  argv 
)

Definition at line 362 of file BogoShim.cpp.

References clientTest(), i, folly::INFO, fizz::CryptoUtils::init(), kKnownFlags, kUnimplemented, serverTest(), and string.

362  {
363  // Convert "-" in args to "_" so that we can use GFLAGS.
364  for (int i = 1; i < argc; i++) {
365  if (argv[i][0] == '-') {
366  for (char* j = argv[i] + 2; *j; j++) {
367  if (*j == '-') {
368  *j = '_';
369  }
370  }
371  if (std::find(
372  kKnownFlags.begin(),
373  kKnownFlags.end(),
374  std::string(argv[i] + 1)) == kKnownFlags.end()) {
375  LOG(INFO) << "unknown flag: " << argv[i];
376  return kUnimplemented;
377  }
378  }
379  }
380 
381  gflags::ParseCommandLineFlags(&argc, &argv, true);
382  google::InitGoogleLogging(argv[0]);
384 
385  if (FLAGS_port == 0) {
386  throw std::runtime_error("must specify port");
387  }
388 
389  if (FLAGS_server) {
390  return serverTest();
391  } else {
392  return clientTest();
393  }
394 }
int clientTest()
Definition: BogoShim.cpp:335
void init()
static std::vector< std::string > kKnownFlags
Definition: BogoShim.cpp:34
char ** argv
const char * string
Definition: Conv.cpp:212
int serverTest()
Definition: BogoShim.cpp:297
static constexpr int kUnimplemented
Definition: BogoShim.cpp:32
std::unique_ptr<SelfCert> readSelfCert ( )

Definition at line 266 of file BogoShim.cpp.

References b, and folly::gen::move.

Referenced by clientTest(), and serverTest().

266  {
267  BioUniquePtr b(BIO_new(BIO_s_file()));
268  BIO_read_filename(b.get(), FLAGS_cert_file.c_str());
269  std::vector<X509UniquePtr> certs;
270  while (true) {
271  X509UniquePtr x509(PEM_read_bio_X509(b.get(), nullptr, nullptr, nullptr));
272  if (!x509) {
273  break;
274  } else {
275  certs.push_back(std::move(x509));
276  }
277  }
278  if (certs.empty()) {
279  throw std::runtime_error("could not read cert");
280  }
281 
282  b.reset(BIO_new(BIO_s_file()));
283  BIO_read_filename(b.get(), FLAGS_key_file.c_str());
284  EvpPkeyUniquePtr key(
285  PEM_read_bio_PrivateKey(b.get(), nullptr, nullptr, nullptr));
286 
287  std::unique_ptr<SelfCert> cert;
288  if (EVP_PKEY_id(key.get()) == EVP_PKEY_RSA) {
289  return std::make_unique<TestRsaCert>(std::move(key), std::move(certs));
290  } else if (EVP_PKEY_id(key.get()) == EVP_PKEY_EC) {
291  return std::make_unique<TestP256Cert>(std::move(key), std::move(certs));
292  } else {
293  throw std::runtime_error("unknown cert type");
294  }
295 }
std::unique_ptr< X509, X509Deleter > X509UniquePtr
char b
std::unique_ptr< BIO, BioDeleter > BioUniquePtr
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::unique_ptr< EVP_PKEY, EvpPkeyDeleter > EvpPkeyUniquePtr
int serverTest ( )

Definition at line 297 of file BogoShim.cpp.

References i, folly::INFO, kUnimplemented, folly::EventBase::loop(), folly::gen::move, folly::gen::range(), and readSelfCert().

Referenced by main().

297  {
298  auto certManager = std::make_unique<CertManager>();
299  certManager->addCert(readSelfCert(), true);
300 
301  auto ticketCipher = std::make_shared<AES128TicketCipher>();
302  auto ticketSeed = RandomGenerator<32>().generateRandom();
303  ticketCipher->setTicketSecrets({{range(ticketSeed)}});
304  ticketCipher->setValidity(std::chrono::seconds(60));
305 
306  auto serverContext = std::make_shared<FizzServerContext>();
307  serverContext->setCertManager(std::move(certManager));
308  serverContext->setTicketCipher(ticketCipher);
309  serverContext->setSupportedAlpns({"h2", "http/1.1"});
310  serverContext->setVersionFallbackEnabled(true);
311 
312  EventBase evb;
313  std::vector<std::unique_ptr<BogoTestServer>> servers;
314  for (size_t i = 0; i <= size_t(FLAGS_resume_count); i++) {
315  servers.push_back(std::make_unique<BogoTestServer>(
316  &evb, FLAGS_port, serverContext, nullptr));
317  }
318  evb.loop();
319  for (const auto& server : servers) {
320  if (server->unimplemented()) {
321  LOG(INFO) << "Testing unimplemented feature.";
322  return kUnimplemented;
323  }
324  }
325  for (const auto& server : servers) {
326  if (!server->success()) {
327  LOG(INFO) << "Connection failed.";
328  return 1;
329  }
330  }
331 
332  return 0;
333 }
std::unique_ptr< SelfCert > readSelfCert()
Definition: BogoShim.cpp:266
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
Gen range(Value begin, Value end)
Definition: Base.h:467
static constexpr int kUnimplemented
Definition: BogoShim.cpp:32

Variable Documentation

std::vector<std::string> kKnownFlags
static
Initial value:
{"port",
"server",
"key_file",
"cert_file",
"resume_count"}

Definition at line 34 of file BogoShim.cpp.

Referenced by main().

constexpr int kUnimplemented = 89
static

Definition at line 32 of file BogoShim.cpp.

Referenced by clientTest(), main(), and serverTest().