|  | // Copyright (c) 2012 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 "base/command_line.h" | 
|  | #include "net/third_party/quic/core/crypto/crypto_framer.h" | 
|  | #include "net/third_party/quic/platform/api/quic_text_utils.h" | 
|  |  | 
|  | using quic::Perspective; | 
|  | using std::cerr; | 
|  | using std::cout; | 
|  | using std::endl; | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class CryptoMessagePrinter : public quic::CryptoFramerVisitorInterface { | 
|  | public: | 
|  | explicit CryptoMessagePrinter() {} | 
|  |  | 
|  | void OnHandshakeMessage( | 
|  | const quic::CryptoHandshakeMessage& message) override { | 
|  | cout << message.DebugString() << endl; | 
|  | } | 
|  |  | 
|  | void OnError(quic::CryptoFramer* framer) override { | 
|  | cerr << "Error code: " << framer->error() << endl; | 
|  | cerr << "Error details: " << framer->error_detail() << endl; | 
|  | } | 
|  |  | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | int main(int argc, char* argv[]) { | 
|  | base::CommandLine::Init(argc, argv); | 
|  |  | 
|  | if (argc != 1) { | 
|  | cerr << "Usage: " << argv[0] << " <hex of message>\n"; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | net::CryptoMessagePrinter printer; | 
|  | quic::CryptoFramer framer; | 
|  | framer.set_visitor(&printer); | 
|  | framer.set_process_truncated_messages(true); | 
|  | std::string input = quic::QuicTextUtils::HexDecode(argv[1]); | 
|  | if (!framer.ProcessInput(input)) { | 
|  | return 1; | 
|  | } | 
|  | if (framer.InputBytesRemaining() != 0) { | 
|  | cerr << "Input partially consumed. " << framer.InputBytesRemaining() | 
|  | << " bytes remaining." << endl; | 
|  | return 2; | 
|  | } | 
|  | return 0; | 
|  | } |