From 6b24f0685503649e011c70f1950b998a2210efbb Mon Sep 17 00:00:00 2001 From: John Jones Date: Thu, 2 Feb 2017 15:43:35 -0500 Subject: [PATCH] Multistream nearing completion --- net/multistream.c | 31 ++++++++++++++++++++++++++--- secio/secio.c | 44 ++++++++++------------------------------- test/test_multistream.h | 5 ++--- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/net/multistream.c b/net/multistream.c index 2214763..c545aa6 100644 --- a/net/multistream.c +++ b/net/multistream.c @@ -86,7 +86,7 @@ int libp2p_net_multistream_receive(int socket_fd, char** results, size_t* result * @returns the socket file descriptor of the connection, or -1 on error */ int libp2p_net_multistream_connect(const char* hostname, int port) { - int retVal = -1, socket = -1; + int retVal = -1, return_result = -1, socket = -1; char* results = NULL; size_t results_size; size_t num_bytes = 0; @@ -99,14 +99,39 @@ int libp2p_net_multistream_connect(const char* hostname, int port) { goto exit; // try to receive the protocol id - retVal = libp2p_net_multistream_receive(socket, &results, &results_size); + return_result = libp2p_net_multistream_receive(socket, &results, &results_size); + if (return_result == 0 || results_size < 1) + goto exit; + if (strstr(results, "multistream") == NULL) { + goto exit; + } // send the multistream handshake - const char* protocol_buffer = "/multistream/1.0.0\n"; + char* protocol_buffer = "/multistream/1.0.0\n"; + num_bytes = libp2p_net_multistream_send(socket, (unsigned char*)protocol_buffer, strlen(protocol_buffer)); + if (num_bytes <= 0) + goto exit; + + // that should be successful, now we are in the loop, and it is waiting for a protocol buffer to use, so send it again + protocol_buffer = "/secio/1.0.0\n"; num_bytes = libp2p_net_multistream_send(socket, (const unsigned char*)protocol_buffer, strlen(protocol_buffer)); if (num_bytes <= 0) goto exit; + // we should get it back again, handshake should be complete. + free(results); + results = NULL; + return_result = libp2p_net_multistream_receive(socket, &results, &results_size); + if (return_result == 0 || results_size < 1 || (results[0] == 'n' && results[1] == 'a')) { + // it failed, ask for a list + protocol_buffer = "ls"; + num_bytes = libp2p_net_multistream_send(socket, (const unsigned char*)protocol_buffer, strlen(protocol_buffer)); + if (num_bytes <= 0) + goto exit; + free(results); + results = NULL; + return_result = libp2p_net_multistream_receive(socket, &results, &results_size); + } retVal = socket; exit: diff --git a/secio/secio.c b/secio/secio.c index 387e2ed..a442474 100644 --- a/secio/secio.c +++ b/secio/secio.c @@ -4,7 +4,8 @@ #include "libp2p/secio/secio.h" #include "libp2p/secio/propose.h" -#include "libp2p/net/p2pnet.h" +//#include "libp2p/net/p2pnet.h" +#include "libp2p/net/multistream.h" const char* SupportedExchanges = "P-256,P-384,P-521"; const char* SupportedCiphers = "AES-256,AES-128,Blowfish"; @@ -49,15 +50,13 @@ int libp2p_secio_generate_nonce(char* results, int length) { * @returns true(1) on success, false(0) otherwise */ int libp2p_secio_handshake(struct SecureSession* session, struct RsaPrivateKey* private_key) { - int retVal = 0, results_size = 65535, bytes_written = 0; - size_t protobuf_size = 0; + int retVal = 0, bytes_written = 0; + size_t protobuf_size = 0, results_size = 0; unsigned char* protobuf = 0; - unsigned char results[results_size]; + unsigned char* results = NULL; struct Propose* propose_out = NULL; struct Propose* propose_in = NULL; struct PublicKey* public_key = NULL; - uint32_t ip; - int socket; // generate 16 byte nonce char nonceOut[16]; @@ -84,39 +83,16 @@ int libp2p_secio_handshake(struct SecureSession* session, struct RsaPrivateKey* goto exit; if (!libp2p_secio_propose_protobuf_encode(propose_out, protobuf, protobuf_size, &protobuf_size)) goto exit; - ip = hostname_to_ip(session->host); - socket = socket_open4(); - // connect - if (socket_connect4(socket, ip, session->port) != 0) - goto exit; - // try 1 - // first try to send mulitstream line - char buf[21]; - buf[0] = 23; - strcpy(&buf[1], "/multistream/1.0.0\n"); - bytes_written = socket_write_size(socket, 20, sizeof(uint32_t)); - if (bytes_written != 4) - goto exit; - bytes_written = socket_write(socket, buf, 20, 0); - if (bytes_written != 20) - goto exit; - // check to see what was written back... - bytes_written = socket_read(socket, (char*)&results[0], results_size, 0); - if (bytes_written == 65535) - goto exit; - // end of try 1 + // connect to host + session->socket_descriptor = libp2p_net_multistream_connect(session->host, session->port); - // send struct Propose in protobuf format - bytes_written = socket_write_size(socket, protobuf_size, sizeof(uint32_t)); - if (bytes_written != 4) - goto exit; - bytes_written = socket_write(socket, (char*)protobuf, protobuf_size, 0); - if (bytes_written != protobuf_size) + bytes_written = libp2p_net_multistream_send(session->socket_descriptor, protobuf, protobuf_size); + if (bytes_written <= 0) goto exit; // receive response (turn back into a Propose struct) - bytes_written = socket_read(socket, (char*)&results[0], results_size, 0); + bytes_written = libp2p_net_multistream_receive(session->socket_descriptor, (char**)&results, &results_size); if (bytes_written == 65535) goto exit; diff --git a/test/test_multistream.h b/test/test_multistream.h index 82a086e..d511340 100644 --- a/test/test_multistream.h +++ b/test/test_multistream.h @@ -15,9 +15,8 @@ int test_multistream_connect() { if (socket_fd < 0) goto exit; - // try to respond something, perhaps either the protocol id or the ls command - //const unsigned char* out = "/multistream/1.0.0\n"; - const unsigned char* out = "ls"; + // try to respond something, ls command + const unsigned char* out = "ls\n"; if (libp2p_net_multistream_send(socket_fd, out, strlen((char*)out)) <= 0) goto exit;