Multistream nearing completion
This commit is contained in:
parent
d091a29b19
commit
6b24f06855
3 changed files with 40 additions and 40 deletions
|
@ -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
|
* @returns the socket file descriptor of the connection, or -1 on error
|
||||||
*/
|
*/
|
||||||
int libp2p_net_multistream_connect(const char* hostname, int port) {
|
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;
|
char* results = NULL;
|
||||||
size_t results_size;
|
size_t results_size;
|
||||||
size_t num_bytes = 0;
|
size_t num_bytes = 0;
|
||||||
|
@ -99,14 +99,39 @@ int libp2p_net_multistream_connect(const char* hostname, int port) {
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
// try to receive the protocol id
|
// 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
|
// 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));
|
num_bytes = libp2p_net_multistream_send(socket, (const unsigned char*)protocol_buffer, strlen(protocol_buffer));
|
||||||
if (num_bytes <= 0)
|
if (num_bytes <= 0)
|
||||||
goto exit;
|
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;
|
retVal = socket;
|
||||||
exit:
|
exit:
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
|
|
||||||
#include "libp2p/secio/secio.h"
|
#include "libp2p/secio/secio.h"
|
||||||
#include "libp2p/secio/propose.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* SupportedExchanges = "P-256,P-384,P-521";
|
||||||
const char* SupportedCiphers = "AES-256,AES-128,Blowfish";
|
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
|
* @returns true(1) on success, false(0) otherwise
|
||||||
*/
|
*/
|
||||||
int libp2p_secio_handshake(struct SecureSession* session, struct RsaPrivateKey* private_key) {
|
int libp2p_secio_handshake(struct SecureSession* session, struct RsaPrivateKey* private_key) {
|
||||||
int retVal = 0, results_size = 65535, bytes_written = 0;
|
int retVal = 0, bytes_written = 0;
|
||||||
size_t protobuf_size = 0;
|
size_t protobuf_size = 0, results_size = 0;
|
||||||
unsigned char* protobuf = 0;
|
unsigned char* protobuf = 0;
|
||||||
unsigned char results[results_size];
|
unsigned char* results = NULL;
|
||||||
struct Propose* propose_out = NULL;
|
struct Propose* propose_out = NULL;
|
||||||
struct Propose* propose_in = NULL;
|
struct Propose* propose_in = NULL;
|
||||||
struct PublicKey* public_key = NULL;
|
struct PublicKey* public_key = NULL;
|
||||||
uint32_t ip;
|
|
||||||
int socket;
|
|
||||||
|
|
||||||
// generate 16 byte nonce
|
// generate 16 byte nonce
|
||||||
char nonceOut[16];
|
char nonceOut[16];
|
||||||
|
@ -84,39 +83,16 @@ int libp2p_secio_handshake(struct SecureSession* session, struct RsaPrivateKey*
|
||||||
goto exit;
|
goto exit;
|
||||||
if (!libp2p_secio_propose_protobuf_encode(propose_out, protobuf, protobuf_size, &protobuf_size))
|
if (!libp2p_secio_propose_protobuf_encode(propose_out, protobuf, protobuf_size, &protobuf_size))
|
||||||
goto exit;
|
goto exit;
|
||||||
ip = hostname_to_ip(session->host);
|
|
||||||
socket = socket_open4();
|
|
||||||
// connect
|
|
||||||
if (socket_connect4(socket, ip, session->port) != 0)
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
// try 1
|
// connect to host
|
||||||
// first try to send mulitstream line
|
session->socket_descriptor = libp2p_net_multistream_connect(session->host, session->port);
|
||||||
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
|
|
||||||
|
|
||||||
// send struct Propose in protobuf format
|
bytes_written = libp2p_net_multistream_send(session->socket_descriptor, protobuf, protobuf_size);
|
||||||
bytes_written = socket_write_size(socket, protobuf_size, sizeof(uint32_t));
|
if (bytes_written <= 0)
|
||||||
if (bytes_written != 4)
|
|
||||||
goto exit;
|
|
||||||
bytes_written = socket_write(socket, (char*)protobuf, protobuf_size, 0);
|
|
||||||
if (bytes_written != protobuf_size)
|
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
// receive response (turn back into a Propose struct)
|
// 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)
|
if (bytes_written == 65535)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,8 @@ int test_multistream_connect() {
|
||||||
if (socket_fd < 0)
|
if (socket_fd < 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
// try to respond something, perhaps either the protocol id or the ls command
|
// try to respond something, ls command
|
||||||
//const unsigned char* out = "/multistream/1.0.0\n";
|
const unsigned char* out = "ls\n";
|
||||||
const unsigned char* out = "ls";
|
|
||||||
|
|
||||||
if (libp2p_net_multistream_send(socket_fd, out, strlen((char*)out)) <= 0)
|
if (libp2p_net_multistream_send(socket_fd, out, strlen((char*)out)) <= 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
Loading…
Reference in a new issue