16 zmq::curve_client_t::curve_client_t (session_base_t *session_,
18 const bool downgrade_sub_) :
19 mechanism_base_t (session_,
options_),
20 curve_mechanism_base_t (session_,
32 zmq::curve_client_t::~curve_client_t ()
36 int zmq::curve_client_t::next_handshake_command (msg_t *msg_)
42 rc = produce_hello (msg_);
44 _state = expect_welcome;
47 rc = produce_initiate (msg_);
49 _state = expect_ready;
58 int zmq::curve_client_t::process_handshake_command (msg_t *msg_)
60 const unsigned char *msg_data =
61 static_cast<unsigned char *
> (msg_->data ());
62 const size_t msg_size = msg_->size ();
65 if (curve_client_tools_t::is_handshake_command_welcome (msg_data, msg_size))
66 rc = process_welcome (msg_data, msg_size);
67 else if (curve_client_tools_t::is_handshake_command_ready (msg_data,
69 rc = process_ready (msg_data, msg_size);
70 else if (curve_client_tools_t::is_handshake_command_error (msg_data,
72 rc = process_error (msg_data, msg_size);
74 session->get_socket ()->event_handshake_failed_protocol (
90 int zmq::curve_client_t::encode (msg_t *msg_)
93 return curve_mechanism_base_t::encode (msg_);
96 int zmq::curve_client_t::decode (msg_t *msg_)
99 return curve_mechanism_base_t::decode (msg_);
104 if (_state == connected)
106 if (_state == error_received)
112 int zmq::curve_client_t::produce_hello (msg_t *msg_)
114 int rc = msg_->init_size (200);
117 rc = _tools.produce_hello (msg_->data (), get_and_inc_nonce ());
119 session->get_socket ()->event_handshake_failed_protocol (
133 int zmq::curve_client_t::process_welcome (
const uint8_t *msg_data_,
136 const int rc = _tools.process_welcome (msg_data_, msg_size_,
137 get_writable_precom_buffer ());
140 session->get_socket ()->event_handshake_failed_protocol (
147 _state = send_initiate;
152 int zmq::curve_client_t::produce_initiate (msg_t *msg_)
154 const size_t metadata_length = basic_properties_len ();
155 std::vector<unsigned char, secure_allocator_t<unsigned char> >
156 metadata_plaintext (metadata_length);
158 add_basic_properties (&metadata_plaintext[0], metadata_length);
160 const size_t msg_size =
161 113 + 128 + crypto_box_BOXZEROBYTES + metadata_length;
162 int rc = msg_->init_size (msg_size);
165 rc = _tools.produce_initiate (msg_->data (), msg_size, get_and_inc_nonce (),
166 &metadata_plaintext[0], metadata_length);
169 session->get_socket ()->event_handshake_failed_protocol (
179 int zmq::curve_client_t::process_ready (
const uint8_t *msg_data_,
182 if (msg_size_ < 30) {
183 session->get_socket ()->event_handshake_failed_protocol (
184 session->get_endpoint (),
190 const size_t clen = (msg_size_ - 14) + crypto_box_BOXZEROBYTES;
192 uint8_t ready_nonce[crypto_box_NONCEBYTES];
193 std::vector<uint8_t, secure_allocator_t<uint8_t> > ready_plaintext (
194 crypto_box_ZEROBYTES + clen);
195 std::vector<uint8_t> ready_box (crypto_box_BOXZEROBYTES + 16 + clen);
197 std::fill (ready_box.begin (), ready_box.begin () + crypto_box_BOXZEROBYTES,
199 memcpy (&ready_box[crypto_box_BOXZEROBYTES], msg_data_ + 14,
200 clen - crypto_box_BOXZEROBYTES);
202 memcpy (ready_nonce,
"CurveZMQREADY---", 16);
203 memcpy (ready_nonce + 16, msg_data_ + 6, 8);
206 int rc = crypto_box_open_afternm (&ready_plaintext[0], &ready_box[0], clen,
207 ready_nonce, get_precom_buffer ());
210 session->get_socket ()->event_handshake_failed_protocol (
216 rc = parse_metadata (&ready_plaintext[crypto_box_ZEROBYTES],
217 clen - crypto_box_ZEROBYTES);
222 session->get_socket ()->event_handshake_failed_protocol (
230 int zmq::curve_client_t::process_error (
const uint8_t *msg_data_,
233 if (_state != expect_welcome && _state != expect_ready) {
234 session->get_socket ()->event_handshake_failed_protocol (
240 session->get_socket ()->event_handshake_failed_protocol (
241 session->get_endpoint (),
246 const size_t error_reason_len =
static_cast<size_t> (msg_data_[6]);
247 if (error_reason_len > msg_size_ - 7) {
248 session->get_socket ()->event_handshake_failed_protocol (
249 session->get_endpoint (),
254 const char *error_reason =
reinterpret_cast<const char *
> (msg_data_) + 7;
255 handle_error_reason (error_reason, error_reason_len);
256 _state = error_received;