int zmq::curve_client_t::produce_initiate (msg_t *msg_) { const size_t metadata_length = basic_properties_len (); unsigned char *metadata_plaintext = static_cast<unsigned char *> (malloc (metadata_length)); alloc_assert (metadata_plaintext); add_basic_properties (metadata_plaintext, metadata_length); size_t msg_size = 113 + 128 + crypto_box_BOXZEROBYTES + metadata_length; int rc = msg_->init_size (msg_size); errno_assert (rc == 0); rc = tools.produce_initiate (msg_->data (), msg_size, cn_nonce, metadata_plaintext, metadata_length); free (metadata_plaintext); if (-1 == rc) { session->get_socket ()->event_handshake_failed_protocol ( session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC); // TODO see comment in produce_hello return -1; } cn_nonce++; return 0; }
void zmq::mechanism_t::make_command_with_basic_properties ( msg_t *msg_, const char *prefix, size_t prefix_len) const { const size_t command_size = prefix_len + basic_properties_len (); const int rc = msg_->init_size (command_size); errno_assert (rc == 0); unsigned char *ptr = (unsigned char *) msg_->data (); // Add prefix memcpy (ptr, prefix, prefix_len); ptr += prefix_len; add_basic_properties ( ptr, command_size - (ptr - (unsigned char *) msg_->data ())); }
int zmq::curve_server_t::produce_ready (msg_t *msg_) { const size_t metadata_length = basic_properties_len (); uint8_t ready_nonce[crypto_box_NONCEBYTES]; uint8_t *ready_plaintext = static_cast<uint8_t *> (malloc (crypto_box_ZEROBYTES + metadata_length)); alloc_assert (ready_plaintext); // Create Box [metadata](S'->C') memset (ready_plaintext, 0, crypto_box_ZEROBYTES); uint8_t *ptr = ready_plaintext + crypto_box_ZEROBYTES; ptr += add_basic_properties (ptr, metadata_length); const size_t mlen = ptr - ready_plaintext; memcpy (ready_nonce, "CurveZMQREADY---", 16); put_uint64 (ready_nonce + 16, cn_nonce); uint8_t *ready_box = static_cast<uint8_t *> ( malloc (crypto_box_BOXZEROBYTES + 16 + metadata_length)); alloc_assert (ready_box); int rc = crypto_box_afternm (ready_box, ready_plaintext, mlen, ready_nonce, cn_precom); zmq_assert (rc == 0); free (ready_plaintext); rc = msg_->init_size (14 + mlen - crypto_box_BOXZEROBYTES); errno_assert (rc == 0); uint8_t *ready = static_cast<uint8_t *> (msg_->data ()); memcpy (ready, "\x05READY", 6); // Short nonce, prefixed by "CurveZMQREADY---" memcpy (ready + 6, ready_nonce + 16, 8); // Box [metadata](S'->C') memcpy (ready + 14, ready_box + crypto_box_BOXZEROBYTES, mlen - crypto_box_BOXZEROBYTES); free (ready_box); cn_nonce++; return 0; }