fizz::client::CachedPsk deserializePsk()

in fizz/client/PskSerializationUtils.cpp [70:140]


fizz::client::CachedPsk deserializePsk(
    const std::string& str,
    const fizz::Factory& factory) {
  auto buf = IOBuf::wrapBuffer(str.data(), str.length());
  io::Cursor cursor(buf.get());
  fizz::client::CachedPsk psk;
  psk.type = fizz::PskType::Resumption;

  std::unique_ptr<IOBuf> pskData;
  fizz::detail::readBuf<uint16_t>(pskData, cursor);
  psk.psk = pskData->moveToFbString().toStdString();

  std::unique_ptr<IOBuf> secretData;
  fizz::detail::readBuf<uint16_t>(secretData, cursor);
  psk.secret = secretData->moveToFbString().toStdString();

  fizz::detail::read(psk.version, cursor);
  fizz::detail::read(psk.cipher, cursor);
  uint8_t hasGroup;
  fizz::detail::read(hasGroup, cursor);
  if (hasGroup == 1) {
    fizz::NamedGroup group;
    fizz::detail::read(group, cursor);
    psk.group = group;
  }

  std::unique_ptr<IOBuf> alpnData;
  fizz::detail::readBuf<uint8_t>(alpnData, cursor);
  if (!alpnData->empty()) {
    psk.alpn = alpnData->moveToFbString().toStdString();
  }

  fizz::detail::read(psk.ticketAgeAdd, cursor);

  uint64_t ticketIssueTime;
  fizz::detail::read(ticketIssueTime, cursor);
  psk.ticketIssueTime = std::chrono::time_point<std::chrono::system_clock>(
      std::chrono::milliseconds(ticketIssueTime));

  uint64_t ticketExpirationTime;
  fizz::detail::read(ticketExpirationTime, cursor);
  psk.ticketExpirationTime = std::chrono::time_point<std::chrono::system_clock>(
      std::chrono::seconds(ticketExpirationTime));

  CertificateEntry entry;
  fizz::detail::readBuf<uint32_t>(entry.cert_data, cursor);
  if (!entry.cert_data->empty()) {
    psk.serverCert = factory.makePeerCert(std::move(entry), true);
  }

  CertificateEntry clientEntry;
  fizz::detail::readBuf<uint32_t>(clientEntry.cert_data, cursor);
  if (!clientEntry.cert_data->empty()) {
    psk.clientCert = factory.makePeerCert(std::move(clientEntry), true);
  }

  fizz::detail::read(psk.maxEarlyDataSize, cursor);

  if (!cursor.isAtEnd()) {
    uint64_t ticketHandshakeTime;
    fizz::detail::read(ticketHandshakeTime, cursor);
    psk.ticketHandshakeTime =
        std::chrono::time_point<std::chrono::system_clock>(
            std::chrono::milliseconds(ticketHandshakeTime));
  } else {
    // Just assign it now();
    psk.ticketHandshakeTime = std::chrono::system_clock::now();
  }

  return psk;
}