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