From 38419164b6f1ade468bf4b1d27929b3ac2503b6e Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Fri, 26 Feb 2016 14:22:11 -0500 Subject: [PATCH 1/5] optional.hpp: Allow easy access to contained type --- include/fc/optional.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/fc/optional.hpp b/include/fc/optional.hpp index dfb725d..bb760a5 100644 --- a/include/fc/optional.hpp +++ b/include/fc/optional.hpp @@ -18,9 +18,11 @@ namespace fc { * fc::optional adds less than 400. */ template - class optional + class optional { public: + typedef T value_type; + optional():_valid(false){} ~optional(){ reset(); } From d5370fc2ea436fa4340cda01af98c7993fbc67d5 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Thu, 3 Mar 2016 16:42:36 -0500 Subject: [PATCH 2/5] Update the websocketpp library and change the configuration options we pass when creating the websocket servers to enable deflate compression on websocket frames. This is relevant to cryptonomex/graphene#540 because the spammed data is higly compressible. In my tests, it reduces bandwidth for a single idle node by a factor of ~16, from 577kbps down to 36kbps. This doesn't require any changes to the wallets, simply upgrading the public servers will begin sending compressed data to all clients that support it. Note: this commit adds a dependency on zlib for non-apple platforms (it was already required on apple) --- CMakeLists.txt | 19 ++++++----- src/network/http/websocket.cpp | 62 ++++++++++------------------------ vendor/websocketpp | 2 +- 3 files changed, 29 insertions(+), 54 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9931b9a..eeadd2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,6 +142,17 @@ find_package(OpenSSL REQUIRED) set( CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_LIB_SUFFIXES} ) +# We are now building in support for deflate compression into our websockets layer by default, +# which requires zlib. Aside from that, all of fc compiles without zlib, so this could be +# made optional without much effort +# (important exception, apple: as of 10.10 yosemite, the OpenSSL static libraries shipped with +# os x have a dependency on zlib) +# On a side note, fc's fc::zlib_compress() function uses a separate implementation of zlib +# from the miniz library. If we're comfortable requiring an external zlib, we can +# reimplement fc::zlib_compress() to call the real zlib, and remove miniz.c from our +# repository. +find_package( ZLIB REQUIRED ) + option( UNITY_BUILD OFF ) set( fc_sources @@ -473,14 +484,6 @@ if(WIN32) endif(WIN32) -IF(APPLE) - # As of 10.10 yosemite, the OpenSSL static libraries shipped with os x have a dependency - # on zlib, so any time you link in openssl you also need to link zlib. . We really want to detect whether openssl was configured with the --no-zlib - # option or not when it was built, but that's difficult to do in practice, so we - # just always try to link it in on mac. - find_package( ZLIB REQUIRED ) -ENDIF(APPLE) - SET(OPENSSL_CONF_TARGET ) IF(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) SET (OPENSSL_CONF_TARGET ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index 67745d9..c75f0e8 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -61,47 +62,12 @@ namespace fc { namespace http { transport_type; static const long timeout_open_handshake = 0; - }; - struct asio_tls_with_stub_log : public websocketpp::config::asio_tls { - typedef asio_with_stub_log type; - typedef asio_tls base; + /// permessage_compress extension + struct permessage_deflate_config {}; - typedef base::concurrency_type concurrency_type; - - typedef base::request_type request_type; - typedef base::response_type response_type; - - typedef base::message_type message_type; - typedef base::con_msg_manager_type con_msg_manager_type; - typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; - - /// Custom Logging policies - /*typedef websocketpp::log::syslog elog_type; - typedef websocketpp::log::syslog alog_type; - */ - //typedef base::alog_type alog_type; - //typedef base::elog_type elog_type; - typedef websocketpp::log::stub elog_type; - typedef websocketpp::log::stub alog_type; - - typedef base::rng_type rng_type; - - struct transport_config : public base::transport_config { - typedef type::concurrency_type concurrency_type; - typedef type::alog_type alog_type; - typedef type::elog_type elog_type; - typedef type::request_type request_type; - typedef type::response_type response_type; - typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; - }; - - typedef websocketpp::transport::asio::endpoint - transport_type; - - static const long timeout_open_handshake = 0; + typedef websocketpp::extensions::permessage_deflate::enabled + permessage_deflate_type; }; struct asio_tls_stub_log : public websocketpp::config::asio_tls { typedef asio_tls_stub_log type; @@ -124,16 +90,22 @@ namespace fc { namespace http { typedef base::rng_type rng_type; struct transport_config : public base::transport_config { - typedef type::concurrency_type concurrency_type; - typedef type::alog_type alog_type; - typedef type::elog_type elog_type; - typedef type::request_type request_type; - typedef type::response_type response_type; - typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; + typedef type::concurrency_type concurrency_type; + typedef type::alog_type alog_type; + typedef type::elog_type elog_type; + typedef type::request_type request_type; + typedef type::response_type response_type; + typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; }; typedef websocketpp::transport::asio::endpoint transport_type; + + /// permessage_compress extension + struct permessage_deflate_config {}; + + typedef websocketpp::extensions::permessage_deflate::enabled + permessage_deflate_type; }; diff --git a/vendor/websocketpp b/vendor/websocketpp index c5510d6..378437a 160000 --- a/vendor/websocketpp +++ b/vendor/websocketpp @@ -1 +1 @@ -Subproject commit c5510d6de04917812b910a8dd44735c1f17061d9 +Subproject commit 378437aecdcb1dfe62096ffd5d944bf1f640ccc3 From 21045dde5faa8fcf5f43b97c85f9df210317633b Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Thu, 10 Mar 2016 17:22:28 -0500 Subject: [PATCH 3/5] Add an option to the websocket server constructor to allow disabling deflate compression. Refactored the code to remove duplication between tls/non-tls versions of the server, which appear to have been cut & paste copies of one another that had diverged slightly. This makes some of the fixes to the non-tls server available in the tls server. cryptonomex/graphene#619 --- include/fc/network/http/websocket.hpp | 16 +- src/network/http/websocket.cpp | 374 +++++++++++++------------- 2 files changed, 196 insertions(+), 194 deletions(-) diff --git a/include/fc/network/http/websocket.hpp b/include/fc/network/http/websocket.hpp index c0c7266..1cb6417 100644 --- a/include/fc/network/http/websocket.hpp +++ b/include/fc/network/http/websocket.hpp @@ -8,8 +8,7 @@ namespace fc { namespace http { namespace detail { - class websocket_server_impl; - class websocket_tls_server_impl; + class abstract_websocket_server; class websocket_client_impl; class websocket_tls_client_impl; } // namespace detail; @@ -42,7 +41,7 @@ namespace fc { namespace http { class websocket_server { public: - websocket_server(); + websocket_server(bool enable_permessage_deflate = true); ~websocket_server(); void on_connection( const on_connection_handler& handler); @@ -51,16 +50,16 @@ namespace fc { namespace http { void start_accept(); private: - friend class detail::websocket_server_impl; - std::unique_ptr my; + std::unique_ptr my; }; class websocket_tls_server { public: - websocket_tls_server( const std::string& server_pem = std::string(), - const std::string& ssl_password = std::string()); + websocket_tls_server(const std::string& server_pem = std::string(), + const std::string& ssl_password = std::string(), + bool enable_permessage_deflate = true); ~websocket_tls_server(); void on_connection( const on_connection_handler& handler); @@ -69,8 +68,7 @@ namespace fc { namespace http { void start_accept(); private: - friend class detail::websocket_tls_server_impl; - std::unique_ptr my; + std::unique_ptr my; }; class websocket_client diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index c75f0e8..81a7cad 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -20,12 +20,11 @@ namespace fc { namespace http { namespace detail { - struct asio_with_stub_log : public websocketpp::config::asio { - typedef asio_with_stub_log type; typedef asio base; + //// All boilerplate copying the base class's config, except as noted typedef base::concurrency_type concurrency_type; typedef base::request_type request_type; @@ -34,15 +33,8 @@ namespace fc { namespace http { typedef base::message_type message_type; typedef base::con_msg_manager_type con_msg_manager_type; typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; - - /// Custom Logging policies - /*typedef websocketpp::log::syslog elog_type; - typedef websocketpp::log::syslog alog_type; - */ - //typedef base::alog_type alog_type; - //typedef base::elog_type elog_type; + + /// Custom Logging policies, use do-nothing log::stub instead of log::basic typedef websocketpp::log::stub elog_type; typedef websocketpp::log::stub alog_type; @@ -61,60 +53,124 @@ namespace fc { namespace http { typedef websocketpp::transport::asio::endpoint transport_type; + // override default value of 5 sec timeout static const long timeout_open_handshake = 0; + }; + + struct asio_with_stub_log_and_deflate : public websocketpp::config::asio { + typedef asio_with_stub_log_and_deflate type; + typedef asio base; - /// permessage_compress extension + //// All boilerplate copying the base class's config, except as noted + typedef base::concurrency_type concurrency_type; + + typedef base::request_type request_type; + typedef base::response_type response_type; + + typedef base::message_type message_type; + typedef base::con_msg_manager_type con_msg_manager_type; + typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; + + /// Custom Logging policies, use do-nothing log::stub instead of log::basic + typedef websocketpp::log::stub elog_type; + typedef websocketpp::log::stub alog_type; + + typedef base::rng_type rng_type; + + struct transport_config : public base::transport_config { + typedef type::concurrency_type concurrency_type; + typedef type::alog_type alog_type; + typedef type::elog_type elog_type; + typedef type::request_type request_type; + typedef type::response_type response_type; + typedef websocketpp::transport::asio::basic_socket::endpoint + socket_type; + }; + + typedef websocketpp::transport::asio::endpoint + transport_type; + + /// enable the permessage_compress extension struct permessage_deflate_config {}; + typedef websocketpp::extensions::permessage_deflate::enabled + permessage_deflate_type; + // override default value of 5 sec timeout + static const long timeout_open_handshake = 0; + }; + + struct asio_tls_stub_log : public websocketpp::config::asio_tls { + typedef asio_tls_stub_log type; + typedef asio_tls base; + + //// All boilerplate copying the base class's config, except as noted + typedef base::concurrency_type concurrency_type; + + typedef base::request_type request_type; + typedef base::response_type response_type; + + typedef base::message_type message_type; + typedef base::con_msg_manager_type con_msg_manager_type; + typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; + + /// Custom Logging policies, use do-nothing log::stub instead of log::basic + typedef websocketpp::log::stub elog_type; + typedef websocketpp::log::stub alog_type; + + typedef base::rng_type rng_type; + + struct transport_config : public base::transport_config { + typedef type::concurrency_type concurrency_type; + typedef type::alog_type alog_type; + typedef type::elog_type elog_type; + typedef type::request_type request_type; + typedef type::response_type response_type; + typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; + }; + + typedef websocketpp::transport::asio::endpoint + transport_type; + }; + + struct asio_tls_stub_log_and_deflate : public websocketpp::config::asio_tls { + typedef asio_tls_stub_log_and_deflate type; + typedef asio_tls base; + + //// All boilerplate copying the base class's config, except as noted + typedef base::concurrency_type concurrency_type; + + typedef base::request_type request_type; + typedef base::response_type response_type; + + typedef base::message_type message_type; + typedef base::con_msg_manager_type con_msg_manager_type; + typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; + + /// Custom Logging policies, use do-nothing log::stub instead of log::basic + typedef websocketpp::log::stub elog_type; + typedef websocketpp::log::stub alog_type; + + typedef base::rng_type rng_type; + + struct transport_config : public base::transport_config { + typedef type::concurrency_type concurrency_type; + typedef type::alog_type alog_type; + typedef type::elog_type elog_type; + typedef type::request_type request_type; + typedef type::response_type response_type; + typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; + }; + + typedef websocketpp::transport::asio::endpoint + transport_type; + + /// enable the permessage_compress extension + struct permessage_deflate_config {}; typedef websocketpp::extensions::permessage_deflate::enabled permessage_deflate_type; }; - struct asio_tls_stub_log : public websocketpp::config::asio_tls { - typedef asio_tls_stub_log type; - typedef asio_tls base; - - typedef base::concurrency_type concurrency_type; - - typedef base::request_type request_type; - typedef base::response_type response_type; - - typedef base::message_type message_type; - typedef base::con_msg_manager_type con_msg_manager_type; - typedef base::endpoint_msg_manager_type endpoint_msg_manager_type; - - //typedef base::alog_type alog_type; - //typedef base::elog_type elog_type; - typedef websocketpp::log::stub elog_type; - typedef websocketpp::log::stub alog_type; - - typedef base::rng_type rng_type; - - struct transport_config : public base::transport_config { - typedef type::concurrency_type concurrency_type; - typedef type::alog_type alog_type; - typedef type::elog_type elog_type; - typedef type::request_type request_type; - typedef type::response_type response_type; - typedef websocketpp::transport::asio::tls_socket::endpoint socket_type; - }; - - typedef websocketpp::transport::asio::endpoint - transport_type; - - /// permessage_compress extension - struct permessage_deflate_config {}; - - typedef websocketpp::extensions::permessage_deflate::enabled - permessage_deflate_type; - }; - - - - using websocketpp::connection_hdl; - typedef websocketpp::server websocket_server_type; - typedef websocketpp::server websocket_tls_server_type; template class websocket_connection_impl : public websocket_connection @@ -145,7 +201,19 @@ namespace fc { namespace http { typedef websocketpp::lib::shared_ptr context_ptr; - class websocket_server_impl + class abstract_websocket_server + { + public: + virtual ~abstract_websocket_server() {} + + virtual void on_connection( const on_connection_handler& handler) = 0; + virtual void listen( uint16_t port ) = 0; + virtual void listen( const fc::ip::endpoint& ep ) = 0; + virtual void start_accept() = 0; + }; + + template + class websocket_server_impl : public abstract_websocket_server { public: websocket_server_impl() @@ -157,15 +225,15 @@ namespace fc { namespace http { _server.set_reuse_addr(true); _server.set_open_handler( [&]( connection_hdl hdl ){ _server_thread.async( [&](){ - auto new_con = std::make_shared>( _server.get_con_from_hdl(hdl) ); + websocket_connection_ptr new_con = std::make_shared::connection_ptr>>( _server.get_con_from_hdl(hdl) ); _on_connection( _connections[hdl] = new_con ); }).wait(); }); - _server.set_message_handler( [&]( connection_hdl hdl, websocket_server_type::message_ptr msg ){ + _server.set_message_handler( [&]( connection_hdl hdl, typename websocketpp::server::message_ptr msg ){ _server_thread.async( [&](){ auto current_con = _connections.find(hdl); assert( current_con != _connections.end() ); - wdump(("server")(msg->get_payload())); + //wdump(("server")(msg->get_payload())); //std::cerr<<"recv: "<get_payload()<<"\n"; auto payload = msg->get_payload(); std::shared_ptr con = current_con->second; @@ -178,13 +246,13 @@ namespace fc { namespace http { _server.set_http_handler( [&]( connection_hdl hdl ){ _server_thread.async( [&](){ - auto current_con = std::make_shared>( _server.get_con_from_hdl(hdl) ); + auto current_con = std::make_shared::connection_ptr>>( _server.get_con_from_hdl(hdl) ); _on_connection( current_con ); auto con = _server.get_con_from_hdl(hdl); con->defer_http_response(); std::string request_body = con->get_request_body(); - wdump(("server")(request_body)); + //wdump(("server")(request_body)); fc::async([current_con, request_body, con] { std::string response = current_con->on_http(request_body); @@ -246,132 +314,62 @@ namespace fc { namespace http { if( _closed ) _closed->wait(); } + void on_connection( const on_connection_handler& handler ) override + { + _on_connection = handler; + } + + void listen( uint16_t port ) override + { + _server.listen(port); + } + + void listen( const fc::ip::endpoint& ep ) override + { + _server.listen( boost::asio::ip::tcp::endpoint( boost::asio::ip::address_v4(uint32_t(ep.get_address())),ep.port()) ); + } + + void start_accept() override + { + _server.start_accept(); + } + typedef std::map > con_map; con_map _connections; fc::thread& _server_thread; - websocket_server_type _server; + websocketpp::server _server; on_connection_handler _on_connection; fc::promise::ptr _closed; uint32_t _pending_messages = 0; }; - class websocket_tls_server_impl + template + class websocket_tls_server_impl : public websocket_server_impl { public: websocket_tls_server_impl( const string& server_pem, const string& ssl_password ) - :_server_thread( fc::thread::current() ) { - //if( server_pem.size() ) - { - _server.set_tls_init_handler( [=]( websocketpp::connection_hdl hdl ) -> context_ptr { - context_ptr ctx = websocketpp::lib::make_shared(boost::asio::ssl::context::tlsv1); - try { - ctx->set_options(boost::asio::ssl::context::default_workarounds | - boost::asio::ssl::context::no_sslv2 | - boost::asio::ssl::context::no_sslv3 | - boost::asio::ssl::context::single_dh_use); - ctx->set_password_callback([=](std::size_t max_length, boost::asio::ssl::context::password_purpose){ return ssl_password;}); - ctx->use_certificate_chain_file(server_pem); - ctx->use_private_key_file(server_pem, boost::asio::ssl::context::pem); - } catch (std::exception& e) { - std::cout << e.what() << std::endl; - } - return ctx; - }); - } - - _server.clear_access_channels( websocketpp::log::alevel::all ); - _server.init_asio(&fc::asio::default_io_service()); - _server.set_reuse_addr(true); - _server.set_open_handler( [&]( connection_hdl hdl ){ - _server_thread.async( [&](){ - auto new_con = std::make_shared>( _server.get_con_from_hdl(hdl) ); - _on_connection( _connections[hdl] = new_con ); - }).wait(); - }); - _server.set_message_handler( [&]( connection_hdl hdl, websocket_server_type::message_ptr msg ){ - _server_thread.async( [&](){ - auto current_con = _connections.find(hdl); - assert( current_con != _connections.end() ); - auto received = msg->get_payload(); - std::shared_ptr con = current_con->second; - fc::async([con,received](){ con->on_message( received ); }); - }).wait(); - }); - - _server.set_http_handler( [&]( connection_hdl hdl ){ - _server_thread.async( [&](){ - - auto current_con = std::make_shared>( _server.get_con_from_hdl(hdl) ); - try{ - _on_connection( current_con ); - - auto con = _server.get_con_from_hdl(hdl); - wdump(("server")(con->get_request_body())); - auto response = current_con->on_http( con->get_request_body() ); - - con->set_body( response ); - con->set_status( websocketpp::http::status_code::ok ); - } catch ( const fc::exception& e ) - { - edump((e.to_detail_string())); - } - current_con->closed(); - - }).wait(); - }); - - _server.set_close_handler( [&]( connection_hdl hdl ){ - _server_thread.async( [&](){ - _connections[hdl]->closed(); - _connections.erase( hdl ); - }).wait(); - }); - - _server.set_fail_handler( [&]( connection_hdl hdl ){ - if( _server.is_listening() ) - { - _server_thread.async( [&](){ - if( _connections.find(hdl) != _connections.end() ) - { - _connections[hdl]->closed(); - _connections.erase( hdl ); - } - }).wait(); - } + this->_server.set_tls_init_handler( [=]( websocketpp::connection_hdl hdl ) -> context_ptr { + context_ptr ctx = websocketpp::lib::make_shared(boost::asio::ssl::context::tlsv1); + try { + ctx->set_options(boost::asio::ssl::context::default_workarounds | + boost::asio::ssl::context::no_sslv2 | + boost::asio::ssl::context::no_sslv3 | + boost::asio::ssl::context::single_dh_use); + ctx->set_password_callback([=](std::size_t max_length, boost::asio::ssl::context::password_purpose){ return ssl_password;}); + ctx->use_certificate_chain_file(server_pem); + ctx->use_private_key_file(server_pem, boost::asio::ssl::context::pem); + } catch (std::exception& e) { + std::cout << e.what() << std::endl; + } + return ctx; }); } - ~websocket_tls_server_impl() - { - if( _server.is_listening() ) - _server.stop_listening(); - auto cpy_con = _connections; - for( auto item : cpy_con ) - _server.close( item.first, 0, "server exit" ); - } - - typedef std::map > con_map; - - con_map _connections; - fc::thread& _server_thread; - websocket_tls_server_type _server; - on_connection_handler _on_connection; - fc::promise::ptr _closed; }; - - - - - - - - - - typedef websocketpp::client websocket_client_type; typedef websocketpp::client websocket_tls_client_type; @@ -514,57 +512,63 @@ namespace fc { namespace http { } // namespace detail - websocket_server::websocket_server():my( new detail::websocket_server_impl() ) {} + websocket_server::websocket_server(bool enable_permessage_deflate /* = true */) : + my( enable_permessage_deflate ? + (detail::abstract_websocket_server*)new detail::websocket_server_impl : + (detail::abstract_websocket_server*)new detail::websocket_server_impl ) + {} websocket_server::~websocket_server(){} void websocket_server::on_connection( const on_connection_handler& handler ) { - my->_on_connection = handler; + my->on_connection(handler); } void websocket_server::listen( uint16_t port ) { - my->_server.listen(port); + my->listen(port); } void websocket_server::listen( const fc::ip::endpoint& ep ) { - my->_server.listen( boost::asio::ip::tcp::endpoint( boost::asio::ip::address_v4(uint32_t(ep.get_address())),ep.port()) ); + my->listen(ep); } void websocket_server::start_accept() { - my->_server.start_accept(); + my->start_accept(); } - websocket_tls_server::websocket_tls_server( const string& server_pem, const string& ssl_password ):my( new detail::websocket_tls_server_impl(server_pem, ssl_password) ) {} + websocket_tls_server::websocket_tls_server(const string& server_pem, + const string& ssl_password, + bool enable_permessage_deflate /* = true */) : + my( enable_permessage_deflate ? + (detail::abstract_websocket_server*)new detail::websocket_tls_server_impl(server_pem, ssl_password) : + (detail::abstract_websocket_server*)new detail::websocket_tls_server_impl(server_pem, ssl_password) ) + {} websocket_tls_server::~websocket_tls_server(){} void websocket_tls_server::on_connection( const on_connection_handler& handler ) { - my->_on_connection = handler; + my->on_connection(handler); } void websocket_tls_server::listen( uint16_t port ) { - my->_server.listen(port); + my->listen(port); } void websocket_tls_server::listen( const fc::ip::endpoint& ep ) { - my->_server.listen( boost::asio::ip::tcp::endpoint( boost::asio::ip::address_v4(uint32_t(ep.get_address())),ep.port()) ); + my->listen(ep); } - void websocket_tls_server::start_accept() { - my->_server.start_accept(); + void websocket_tls_server::start_accept() + { + my->start_accept(); } - websocket_tls_client::websocket_tls_client():my( new detail::websocket_tls_client_impl() ) {} - websocket_tls_client::~websocket_tls_client(){ } - - - websocket_client::websocket_client():my( new detail::websocket_client_impl() ),smy(new detail::websocket_tls_client_impl()) {} websocket_client::~websocket_client(){ } From eaa763aff18e0c8c52e093ae9850a216a98ab435 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Fri, 11 Mar 2016 12:33:33 -0500 Subject: [PATCH 4/5] adding canonical flag --- include/fc/crypto/elliptic.hpp | 2 +- src/crypto/elliptic_impl_priv.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/fc/crypto/elliptic.hpp b/include/fc/crypto/elliptic.hpp index 99cd68a..dd60da7 100644 --- a/include/fc/crypto/elliptic.hpp +++ b/include/fc/crypto/elliptic.hpp @@ -123,7 +123,7 @@ namespace fc { fc::sha512 get_shared_secret( const public_key& pub )const; // signature sign( const fc::sha256& digest )const; - compact_signature sign_compact( const fc::sha256& digest )const; + compact_signature sign_compact( const fc::sha256& digest, bool require_canonical = true )const; // bool verify( const fc::sha256& digest, const signature& sig ); public_key get_public_key()const; diff --git a/src/crypto/elliptic_impl_priv.cpp b/src/crypto/elliptic_impl_priv.cpp index ad79ebe..585ffde 100644 --- a/src/crypto/elliptic_impl_priv.cpp +++ b/src/crypto/elliptic_impl_priv.cpp @@ -85,7 +85,7 @@ namespace fc { namespace ecc { return secp256k1_nonce_function_default( nonce32, msg32, key32, *extra, nullptr ); } - compact_signature private_key::sign_compact( const fc::sha256& digest )const + compact_signature private_key::sign_compact( const fc::sha256& digest, bool require_canonical )const { FC_ASSERT( my->_key != empty_priv ); compact_signature result; @@ -94,7 +94,7 @@ namespace fc { namespace ecc { do { FC_ASSERT( secp256k1_ecdsa_sign_compact( detail::_get_context(), (unsigned char*) digest.data(), (unsigned char*) result.begin() + 1, (unsigned char*) my->_key.data(), extended_nonce_function, &counter, &recid )); - } while( !public_key::is_canonical( result ) ); + } while( require_canonical && !public_key::is_canonical( result ) ); result.begin()[0] = 27 + 4 + recid; return result; } From 622ff58039f2388433272a44fe416f5b8025589a Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Mon, 14 Mar 2016 18:26:29 -0400 Subject: [PATCH 5/5] Make websocket permessage-deflate default to disabled since it causes problems with Chrome --- include/fc/network/http/websocket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/network/http/websocket.hpp b/include/fc/network/http/websocket.hpp index 1cb6417..bcb022e 100644 --- a/include/fc/network/http/websocket.hpp +++ b/include/fc/network/http/websocket.hpp @@ -59,7 +59,7 @@ namespace fc { namespace http { public: websocket_tls_server(const std::string& server_pem = std::string(), const std::string& ssl_password = std::string(), - bool enable_permessage_deflate = true); + bool enable_permessage_deflate = false); ~websocket_tls_server(); void on_connection( const on_connection_handler& handler);