Commit 8e6bafcb authored by Luca Boccassi's avatar Luca Boccassi

Problem: application metadata not parsed correctly when using CURVE

Solution: create buffers large enough to contain arbitrary metadata
parent ddd0da2f
...@@ -327,8 +327,12 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -327,8 +327,12 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
const size_t clen = (size - 113) + crypto_box_BOXZEROBYTES; const size_t clen = (size - 113) + crypto_box_BOXZEROBYTES;
uint8_t initiate_nonce[crypto_box_NONCEBYTES]; uint8_t initiate_nonce[crypto_box_NONCEBYTES];
uint8_t initiate_plaintext[crypto_box_ZEROBYTES + 128 + 256]; uint8_t *initiate_plaintext =
uint8_t initiate_box[crypto_box_BOXZEROBYTES + 144 + 256]; static_cast<uint8_t *> (malloc (crypto_box_ZEROBYTES + clen));
alloc_assert (initiate_plaintext);
uint8_t *initiate_box =
static_cast<uint8_t *> (malloc (crypto_box_BOXZEROBYTES + clen));
alloc_assert (initiate_box);
// Open Box [C + vouch + metadata](C'->S') // Open Box [C + vouch + metadata](C'->S')
memset (initiate_box, 0, crypto_box_BOXZEROBYTES); memset (initiate_box, 0, crypto_box_BOXZEROBYTES);
...@@ -339,6 +343,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -339,6 +343,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
memcpy (initiate_nonce + 16, initiate + 105, 8); memcpy (initiate_nonce + 16, initiate + 105, 8);
cn_peer_nonce = get_uint64 (initiate + 105); cn_peer_nonce = get_uint64 (initiate + 105);
const uint8_t *client_key = initiate_plaintext + crypto_box_ZEROBYTES;
rc = crypto_box_open (initiate_plaintext, initiate_box, clen, rc = crypto_box_open (initiate_plaintext, initiate_box, clen,
initiate_nonce, _cn_client, _cn_secret); initiate_nonce, _cn_client, _cn_secret);
if (rc != 0) { if (rc != 0) {
...@@ -346,11 +352,10 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -346,11 +352,10 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
session->get_socket ()->event_handshake_failed_protocol ( session->get_socket ()->event_handshake_failed_protocol (
session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC); session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC);
errno = EPROTO; errno = EPROTO;
return -1; rc = -1;
goto exit;
} }
const uint8_t *client_key = initiate_plaintext + crypto_box_ZEROBYTES;
uint8_t vouch_nonce[crypto_box_NONCEBYTES]; uint8_t vouch_nonce[crypto_box_NONCEBYTES];
uint8_t vouch_plaintext[crypto_box_ZEROBYTES + 64]; uint8_t vouch_plaintext[crypto_box_ZEROBYTES + 64];
uint8_t vouch_box[crypto_box_BOXZEROBYTES + 80]; uint8_t vouch_box[crypto_box_BOXZEROBYTES + 80];
...@@ -371,7 +376,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -371,7 +376,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
session->get_socket ()->event_handshake_failed_protocol ( session->get_socket ()->event_handshake_failed_protocol (
session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC); session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC);
errno = EPROTO; errno = EPROTO;
return -1; rc = -1;
goto exit;
} }
// What we decrypted must be the client's short-term public key // What we decrypted must be the client's short-term public key
...@@ -383,7 +389,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -383,7 +389,8 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
session->get_socket ()->event_handshake_failed_protocol ( session->get_socket ()->event_handshake_failed_protocol (
session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_KEY_EXCHANGE); session->get_endpoint (), ZMQ_PROTOCOL_ERROR_ZMTP_KEY_EXCHANGE);
errno = EPROTO; errno = EPROTO;
return -1; rc = -1;
goto exit;
} }
// Precompute connection secret from client key // Precompute connection secret from client key
...@@ -405,7 +412,7 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -405,7 +412,7 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
// is attempted) // is attempted)
rc = receive_and_process_zap_reply (); rc = receive_and_process_zap_reply ();
if (rc == -1) if (rc == -1)
return -1; goto exit;
} else if (!options.zap_enforce_domain) { } else if (!options.zap_enforce_domain) {
// This supports the Stonehouse pattern (encryption without // This supports the Stonehouse pattern (encryption without
// authentication) in legacy mode (domain set but no handler). // authentication) in legacy mode (domain set but no handler).
...@@ -413,15 +420,21 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_) ...@@ -413,15 +420,21 @@ int zmq::curve_server_t::process_initiate (msg_t *msg_)
} else { } else {
session->get_socket ()->event_handshake_failed_no_detail ( session->get_socket ()->event_handshake_failed_no_detail (
session->get_endpoint (), EFAULT); session->get_endpoint (), EFAULT);
return -1; rc = -1;
goto exit;
} }
} else { } else {
// This supports the Stonehouse pattern (encryption without authentication). // This supports the Stonehouse pattern (encryption without authentication).
state = sending_ready; state = sending_ready;
} }
return parse_metadata (initiate_plaintext + crypto_box_ZEROBYTES + 128, rc = parse_metadata (initiate_plaintext + crypto_box_ZEROBYTES + 128,
clen - crypto_box_ZEROBYTES - 128); clen - crypto_box_ZEROBYTES - 128);
exit:
free (initiate_plaintext);
free (initiate_box);
return rc;
} }
int zmq::curve_server_t::produce_ready (msg_t *msg_) int zmq::curve_server_t::produce_ready (msg_t *msg_)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment