| // Copyright (c) 2019 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // Dumps the contents of a QUIC crypto handshake message in a human readable | |
| // format. | |
| // | |
| // Usage: crypto_message_printer_bin <hex of message> | |
| #include <iostream> | |
| #include <string> | |
| #include "absl/strings/escaping.h" | |
| #include "quiche/quic/core/crypto/crypto_framer.h" | |
| #include "quiche/quic/core/quic_utils.h" | |
| #include "quiche/common/platform/api/quiche_command_line_flags.h" | |
| using std::cerr; | |
| using std::cout; | |
| using std::endl; | |
| namespace quic { | |
| class CryptoMessagePrinter : public ::quic::CryptoFramerVisitorInterface { | |
| public: | |
| void OnHandshakeMessage(const CryptoHandshakeMessage& message) override { | |
| cout << message.DebugString() << endl; | |
| } | |
| void OnError(CryptoFramer* framer) override { | |
| cerr << "Error code: " << framer->error() << endl; | |
| cerr << "Error details: " << framer->error_detail() << endl; | |
| } | |
| }; | |
| } // namespace quic | |
| int main(int argc, char* argv[]) { | |
| const char* usage = "Usage: crypto_message_printer <hex>"; | |
| std::vector<std::string> messages = | |
| quiche::QuicheParseCommandLineFlags(usage, argc, argv); | |
| if (messages.size() != 1) { | |
| quiche::QuichePrintCommandLineFlagHelp(usage); | |
| exit(0); | |
| } | |
| quic::CryptoMessagePrinter printer; | |
| quic::CryptoFramer framer; | |
| framer.set_visitor(&printer); | |
| framer.set_process_truncated_messages(true); | |
| std::string input = absl::HexStringToBytes(messages[0]); | |
| if (!framer.ProcessInput(input)) { | |
| return 1; | |
| } | |
| if (framer.InputBytesRemaining() != 0) { | |
| cerr << "Input partially consumed. " << framer.InputBytesRemaining() | |
| << " bytes remaining." << endl; | |
| return 2; | |
| } | |
| return 0; | |
| } |