More progress on secio
This commit is contained in:
parent
773c980f1f
commit
c1620d1d8b
9 changed files with 151 additions and 52 deletions
|
@ -191,6 +191,7 @@ int libp2p_crypto_ephemeral_keypair_generate(char* curve, struct EphemeralPrivat
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
||||||
|
mbedtls_ecp_point_free(&point);
|
||||||
mbedtls_ctr_drbg_free(&ctr_drbg);
|
mbedtls_ctr_drbg_free(&ctr_drbg);
|
||||||
mbedtls_entropy_free(&entropy);
|
mbedtls_entropy_free(&entropy);
|
||||||
mbedtls_ecdsa_free(&ctx);
|
mbedtls_ecdsa_free(&ctx);
|
||||||
|
|
22
crypto/key.c
22
crypto/key.c
|
@ -34,7 +34,7 @@ void libp2p_crypto_public_key_free(struct PublicKey* in) {
|
||||||
* @param in the public key to examine
|
* @param in the public key to examine
|
||||||
* @returns the size in bytes
|
* @returns the size in bytes
|
||||||
*/
|
*/
|
||||||
size_t libp2p_crypto_public_key_protobuf_encode_size(struct PublicKey* in) {
|
size_t libp2p_crypto_public_key_protobuf_encode_size(const struct PublicKey* in) {
|
||||||
return 11 + 11 + in->data_size;
|
return 11 + 11 + in->data_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ size_t libp2p_crypto_public_key_protobuf_encode_size(struct PublicKey* in) {
|
||||||
* @param bytes_written how many bytes were used in the buffer
|
* @param bytes_written how many bytes were used in the buffer
|
||||||
* @returns true(1) on success, otherwise false(0)
|
* @returns true(1) on success, otherwise false(0)
|
||||||
*/
|
*/
|
||||||
int libp2p_crypto_public_key_protobuf_encode(struct PublicKey* in, unsigned char* buffer, size_t max_buffer_length, size_t* bytes_written) {
|
int libp2p_crypto_public_key_protobuf_encode(const struct PublicKey* in, unsigned char* buffer, size_t max_buffer_length, size_t* bytes_written) {
|
||||||
// data & data_size
|
// data & data_size
|
||||||
size_t bytes_used = 0;
|
size_t bytes_used = 0;
|
||||||
*bytes_written = 0;
|
*bytes_written = 0;
|
||||||
|
@ -130,6 +130,24 @@ void libp2p_crypto_private_key_free(struct PrivateKey* in) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int libp2p_crypto_private_key_protobuf_encode_size(struct PrivateKey* in) {
|
||||||
|
return 22 + in->data_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int libp2p_crypto_private_key_protobuf_encode(struct PrivateKey* in, unsigned char* buffer, size_t max_buffer_length, size_t* bytes_written) {
|
||||||
|
*bytes_written = 0;
|
||||||
|
size_t bytes_used;
|
||||||
|
// type (RSA vs ED25519)
|
||||||
|
if (!protobuf_encode_varint(1, WIRETYPE_VARINT, in->type, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
|
return 0;
|
||||||
|
*bytes_written += bytes_used;
|
||||||
|
// private key
|
||||||
|
if (!protobuf_encode_length_delimited(2, WIRETYPE_LENGTH_DELIMITED, in->data, in->data_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
|
return 0;
|
||||||
|
*bytes_written += bytes_used;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unmarshal a private key from a protobuf
|
* Unmarshal a private key from a protobuf
|
||||||
* @param buffer the protobuf
|
* @param buffer the protobuf
|
||||||
|
|
30
crypto/rsa.c
30
crypto/rsa.c
|
@ -215,16 +215,38 @@ int libp2p_crypto_rsa_private_key_fill_public_key(struct RsaPrivateKey* private_
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct RsaPrivateKey* libp2p_crypto_rsa_rsa_private_key_new() {
|
||||||
|
struct RsaPrivateKey* out = (struct RsaPrivateKey*)malloc(sizeof(struct RsaPrivateKey));
|
||||||
|
if (out != NULL) {
|
||||||
|
out->D = 0;
|
||||||
|
out->DP = 0;
|
||||||
|
out->DQ = 0;
|
||||||
|
out->E = 0;
|
||||||
|
out->N = 0;
|
||||||
|
out->P = 0;
|
||||||
|
out->Q = 0;
|
||||||
|
out->QP = 0;
|
||||||
|
out->der = NULL;
|
||||||
|
out->public_key_length = 0;
|
||||||
|
out->public_key_der = NULL;
|
||||||
|
out->public_key_length = 0;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Free resources used by RsaPrivateKey
|
* Free resources used by RsaPrivateKey
|
||||||
* @param private_key the resources
|
* @param private_key the resources
|
||||||
* @returns true(1)
|
* @returns true(1)
|
||||||
*/
|
*/
|
||||||
int libp2p_crypto_rsa_rsa_private_key_free(struct RsaPrivateKey* private_key) {
|
int libp2p_crypto_rsa_rsa_private_key_free(struct RsaPrivateKey* private_key) {
|
||||||
if (private_key->der != NULL)
|
if (private_key != NULL) {
|
||||||
free(private_key->der);
|
if (private_key->der != NULL)
|
||||||
if (private_key->public_key_der != NULL)
|
free(private_key->der);
|
||||||
free(private_key->public_key_der);
|
if (private_key->public_key_der != NULL)
|
||||||
|
free(private_key->public_key_der);
|
||||||
|
free(private_key);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@ void libp2p_crypto_private_key_free(struct PrivateKey* in);
|
||||||
* Unmarshal a public key from a protobuf
|
* Unmarshal a public key from a protobuf
|
||||||
*/
|
*/
|
||||||
int libp2p_crypto_public_key_protobuf_decode(unsigned char* buffer, size_t buffer_length, struct PublicKey** out);
|
int libp2p_crypto_public_key_protobuf_decode(unsigned char* buffer, size_t buffer_length, struct PublicKey** out);
|
||||||
|
size_t libp2p_crypto_public_key_protobuf_encode_size(const struct PublicKey* in);
|
||||||
|
int libp2p_crypto_public_key_protobuf_encode(const struct PublicKey* in, unsigned char* buffer, size_t max_buffer_length, size_t* bytes_written);
|
||||||
int libp2p_crypto_private_key_protobuf_decode(unsigned char* buffer, size_t buffer_length, struct PrivateKey** out);
|
int libp2p_crypto_private_key_protobuf_decode(unsigned char* buffer, size_t buffer_length, struct PrivateKey** out);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -49,7 +49,7 @@ int libp2p_crypto_rsa_private_key_fill_public_key(struct RsaPrivateKey* private_
|
||||||
* @returns 0
|
* @returns 0
|
||||||
*/
|
*/
|
||||||
int libp2p_crypto_rsa_rsa_private_key_free(struct RsaPrivateKey* private_key);
|
int libp2p_crypto_rsa_rsa_private_key_free(struct RsaPrivateKey* private_key);
|
||||||
|
struct RsaPrivateKey* libp2p_crypto_rsa_rsa_private_key_new();
|
||||||
/**
|
/**
|
||||||
* sign a message
|
* sign a message
|
||||||
* @param private_key the private key
|
* @param private_key the private key
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "libp2p/net/p2pnet.h"
|
#include "libp2p/net/p2pnet.h"
|
||||||
#include "varint.h"
|
#include "varint.h"
|
||||||
|
@ -45,7 +47,7 @@ int libp2p_net_multistream_receive(int socket_fd, char** results, size_t* result
|
||||||
size_t buffer_size = 65535;
|
size_t buffer_size = 65535;
|
||||||
char buffer[buffer_size];
|
char buffer[buffer_size];
|
||||||
char* pos = buffer;
|
char* pos = buffer;
|
||||||
int num_bytes = 0;
|
size_t num_bytes_requested = 0, left = 0, already_read = 0;
|
||||||
|
|
||||||
// first read the varint
|
// first read the varint
|
||||||
while(1) {
|
while(1) {
|
||||||
|
@ -54,25 +56,39 @@ int libp2p_net_multistream_receive(int socket_fd, char** results, size_t* result
|
||||||
pos[0] = c;
|
pos[0] = c;
|
||||||
if (c >> 7 == 0) {
|
if (c >> 7 == 0) {
|
||||||
pos[1] = 0;
|
pos[1] = 0;
|
||||||
num_bytes = varint_decode((unsigned char*)buffer, strlen(buffer), NULL);
|
num_bytes_requested = varint_decode((unsigned char*)buffer, strlen(buffer), NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
if (num_bytes <= 0)
|
if (num_bytes_requested <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// now read the number of bytes we've found
|
left = num_bytes_requested;
|
||||||
bytes = socket_read(socket_fd, buffer, num_bytes, 0);
|
do {
|
||||||
|
bytes = socket_read(socket_fd, &buffer[already_read], left, 0);
|
||||||
|
if (bytes < 0) {
|
||||||
|
bytes = 0;
|
||||||
|
if ( (errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
||||||
|
// do something intelligent
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
left = left - bytes;
|
||||||
|
already_read += bytes;
|
||||||
|
} while (left > 0);
|
||||||
|
|
||||||
if (bytes == 0)
|
if (already_read != num_bytes_requested)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// parse the results, removing the leading size indicator
|
// parse the results, removing the leading size indicator
|
||||||
*results = malloc(bytes);
|
*results = malloc(num_bytes_requested);
|
||||||
memcpy(*results, buffer, bytes);
|
if (*results == NULL)
|
||||||
*results_size = bytes;
|
return 0;
|
||||||
return bytes;
|
memcpy(*results, buffer, num_bytes_requested);
|
||||||
|
*results_size = num_bytes_requested;
|
||||||
|
return num_bytes_requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -77,14 +77,14 @@ int libp2p_secio_propose_protobuf_encode(struct Propose* in, unsigned char* buff
|
||||||
if (!protobuf_encode_length_delimited(2, secio_propose_message_fields[1], (char*)in->public_key, in->public_key_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
if (!protobuf_encode_length_delimited(2, secio_propose_message_fields[1], (char*)in->public_key, in->public_key_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
return 0;
|
return 0;
|
||||||
*bytes_written += bytes_used;
|
*bytes_written += bytes_used;
|
||||||
// ciphers
|
|
||||||
if (!protobuf_encode_length_delimited(3, secio_propose_message_fields[2], in->ciphers, in->ciphers_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
|
||||||
return 0;
|
|
||||||
*bytes_written += bytes_used;
|
|
||||||
// exchanges
|
// exchanges
|
||||||
if (!protobuf_encode_length_delimited(4, secio_propose_message_fields[3], in->exchanges, in->exchanges_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
if (!protobuf_encode_length_delimited(4, secio_propose_message_fields[3], in->exchanges, in->exchanges_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
return 0;
|
return 0;
|
||||||
*bytes_written += bytes_used;
|
*bytes_written += bytes_used;
|
||||||
|
// ciphers
|
||||||
|
if (!protobuf_encode_length_delimited(3, secio_propose_message_fields[2], in->ciphers, in->ciphers_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
|
return 0;
|
||||||
|
*bytes_written += bytes_used;
|
||||||
// hashes
|
// hashes
|
||||||
if (!protobuf_encode_length_delimited(5, secio_propose_message_fields[4], in->hashes, in->hashes_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
if (!protobuf_encode_length_delimited(5, secio_propose_message_fields[4], in->hashes, in->hashes_size, &buffer[*bytes_written], max_buffer_length - *bytes_written, &bytes_used))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -130,18 +130,18 @@ int libp2p_secio_propose_protobuf_decode(unsigned char* buffer, size_t buffer_le
|
||||||
pos += bytes_read;
|
pos += bytes_read;
|
||||||
got_something = 1;
|
got_something = 1;
|
||||||
break;
|
break;
|
||||||
case (3): // ciphers
|
case (3): // exchanges
|
||||||
|
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->exchanges), &((*out)->exchanges_size), &bytes_read) == 0)
|
||||||
|
goto exit;
|
||||||
|
pos += bytes_read;
|
||||||
|
got_something = 1;
|
||||||
|
break;
|
||||||
|
case (4): // ciphers
|
||||||
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->ciphers), &((*out)->ciphers_size), &bytes_read) == 0)
|
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->ciphers), &((*out)->ciphers_size), &bytes_read) == 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
pos += bytes_read;
|
pos += bytes_read;
|
||||||
got_something = 1;
|
got_something = 1;
|
||||||
break;
|
break;
|
||||||
case (4): // exchanges
|
|
||||||
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->exchanges), &((*out)->exchanges_size), &bytes_read) == 0)
|
|
||||||
goto exit;
|
|
||||||
pos += bytes_read;
|
|
||||||
got_something = 1;
|
|
||||||
break;
|
|
||||||
case (5): // hashes
|
case (5): // hashes
|
||||||
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->hashes), &((*out)->hashes_size), &bytes_read) == 0)
|
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&((*out)->hashes), &((*out)->hashes_size), &bytes_read) == 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
|
@ -140,8 +140,8 @@ int libp2p_secio_select_best(int order, const char* local_list, int local_list_s
|
||||||
if (order == 0)
|
if (order == 0)
|
||||||
{
|
{
|
||||||
libp2p_secio_string_allocate(lead_head->string, results);
|
libp2p_secio_string_allocate(lead_head->string, results);
|
||||||
libp2p_utils_string_list_free(lead_head);
|
match = 1;
|
||||||
return 1;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this list doesn't match. Do further investigation
|
// this list doesn't match. Do further investigation
|
||||||
|
@ -158,6 +158,7 @@ int libp2p_secio_select_best(int order, const char* local_list, int local_list_s
|
||||||
while ( lead != NULL ) {
|
while ( lead != NULL ) {
|
||||||
while (follower != NULL) {
|
while (follower != NULL) {
|
||||||
if (strcmp(lead->string, follower->string) == 0) {
|
if (strcmp(lead->string, follower->string) == 0) {
|
||||||
|
libp2p_secio_string_allocate(lead->string, results);
|
||||||
match = 1;
|
match = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -168,9 +169,12 @@ int libp2p_secio_select_best(int order, const char* local_list, int local_list_s
|
||||||
follower = follower_head;
|
follower = follower_head;
|
||||||
lead = lead->next;
|
lead = lead->next;
|
||||||
}
|
}
|
||||||
if (!match)
|
exit:
|
||||||
return 0;
|
if (lead_head != NULL)
|
||||||
return 1;
|
libp2p_utils_string_list_free(lead_head);
|
||||||
|
if (follower_head != NULL)
|
||||||
|
libp2p_utils_string_list_free(follower_head);
|
||||||
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -424,9 +428,14 @@ int libp2p_secio_read(struct SecureSession* session, unsigned char** results, si
|
||||||
if ( (errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
if ( (errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
||||||
// TODO: use epoll or select to wait for socket to be writable
|
// TODO: use epoll or select to wait for socket to be writable
|
||||||
} else {
|
} else {
|
||||||
|
fprintf(stderr, "Error in libp2p_secio_read: %s\n", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (read == 0) {
|
||||||
|
fprintf(stderr, "Reading numbers: [%02x]", size[read]);
|
||||||
|
}
|
||||||
|
fprintf(stderr, " [%02x]", size[read]);
|
||||||
if (read == 0 && size[0] == 10) {
|
if (read == 0 && size[0] == 10) {
|
||||||
// a spurious \n
|
// a spurious \n
|
||||||
// write over this value by not adding it
|
// write over this value by not adding it
|
||||||
|
@ -436,9 +445,9 @@ int libp2p_secio_read(struct SecureSession* session, unsigned char** results, si
|
||||||
}
|
}
|
||||||
} while (left > 0);
|
} while (left > 0);
|
||||||
// now read the number of bytes we've found, minus the 4 that we just read
|
// now read the number of bytes we've found, minus the 4 that we just read
|
||||||
|
fprintf(stderr, " Before ntohl: %u", buffer_size);
|
||||||
buffer_size = ntohl(buffer_size);
|
buffer_size = ntohl(buffer_size);
|
||||||
// JMJ
|
fprintf(stderr, " After: %u\n", buffer_size);
|
||||||
fprintf(stderr, "which switching bits results in %u.\n", buffer_size);
|
|
||||||
if (buffer_size == 0)
|
if (buffer_size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -490,8 +499,9 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
unsigned char* exchange_out_protobuf;
|
unsigned char* exchange_out_protobuf;
|
||||||
size_t exchange_out_protobuf_size;
|
size_t exchange_out_protobuf_size;
|
||||||
struct Exchange* exchange_in;
|
struct Exchange* exchange_in;
|
||||||
struct Libp2pVector* char_buffer;
|
struct Libp2pVector* char_buffer = NULL;
|
||||||
struct StretchedKey* k1 = NULL, *k2 = NULL;
|
struct StretchedKey* k1 = NULL, *k2 = NULL;
|
||||||
|
char* remote_peer_id = NULL;
|
||||||
|
|
||||||
const unsigned char* protocol = (unsigned char*)"/secio/1.0.0\n";
|
const unsigned char* protocol = (unsigned char*)"/secio/1.0.0\n";
|
||||||
|
|
||||||
|
@ -501,7 +511,7 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
|
|
||||||
// we should get back the secio confirmation
|
// we should get back the secio confirmation
|
||||||
bytes_written = libp2p_net_multistream_receive(local_session->socket_descriptor, (char**)&results, &results_size);
|
bytes_written = libp2p_net_multistream_receive(local_session->socket_descriptor, (char**)&results, &results_size);
|
||||||
if (bytes_written < 1 || strstr((char*)results, "secio") == NULL)
|
if (bytes_written < 5 || strstr((char*)results, "secio") == NULL)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
free(results);
|
free(results);
|
||||||
|
@ -523,10 +533,19 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
pub_key.type = KEYTYPE_RSA;
|
pub_key.type = KEYTYPE_RSA;
|
||||||
pub_key.data_size = private_key->public_key_length;
|
pub_key.data_size = private_key->public_key_length;
|
||||||
pub_key.data = malloc(pub_key.data_size);
|
pub_key.data = malloc(pub_key.data_size);
|
||||||
|
memcpy(pub_key.data, private_key->public_key_der, private_key->public_key_length);
|
||||||
results_size = libp2p_crypto_public_key_protobuf_encode_size(&pub_key);
|
results_size = libp2p_crypto_public_key_protobuf_encode_size(&pub_key);
|
||||||
results = malloc(results_size);
|
results = malloc(results_size);
|
||||||
if (libp2p_crypto_public_key_protobuf_encode(&pub_key, results, result_size, &results_size) == 0)
|
if (results == NULL) {
|
||||||
|
free(pub_key.data);
|
||||||
goto exit;
|
goto exit;
|
||||||
|
}
|
||||||
|
if (libp2p_crypto_public_key_protobuf_encode(&pub_key, results, results_size, &results_size) == 0) {
|
||||||
|
free(pub_key.data);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
free(pub_key.data);
|
||||||
|
|
||||||
propose_out->public_key_size = results_size;
|
propose_out->public_key_size = results_size;
|
||||||
propose_out->public_key = malloc(results_size);
|
propose_out->public_key = malloc(results_size);
|
||||||
memcpy(propose_out->public_key, results, results_size);
|
memcpy(propose_out->public_key, results, results_size);
|
||||||
|
@ -562,7 +581,6 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
if (!libp2p_crypto_public_key_protobuf_decode(propose_in->public_key, propose_in->public_key_size, &public_key))
|
if (!libp2p_crypto_public_key_protobuf_decode(propose_in->public_key, propose_in->public_key_size, &public_key))
|
||||||
goto exit;
|
goto exit;
|
||||||
// generate their peer id
|
// generate their peer id
|
||||||
char* remote_peer_id;
|
|
||||||
libp2p_crypto_public_key_to_peer_id(public_key, &remote_peer_id);
|
libp2p_crypto_public_key_to_peer_id(public_key, &remote_peer_id);
|
||||||
|
|
||||||
|
|
||||||
|
@ -572,12 +590,14 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
libp2p_secio_hash(propose_out, order_hash_out);
|
libp2p_secio_hash(propose_out, order_hash_out);
|
||||||
order = libp2p_secio_bytes_compare((char*)order_hash_in, (char*)order_hash_out, 32);
|
order = libp2p_secio_bytes_compare((char*)order_hash_in, (char*)order_hash_out, 32);
|
||||||
// curve
|
// curve
|
||||||
libp2p_secio_select_best(order, propose_out->exchanges, propose_out->exchanges_size, propose_in->exchanges, propose_in->exchanges_size, &local_session->chosen_curve);
|
if (libp2p_secio_select_best(order, propose_out->exchanges, propose_out->exchanges_size, propose_in->exchanges, propose_in->exchanges_size, &local_session->chosen_curve) == 0)
|
||||||
|
goto exit;
|
||||||
// cipher
|
// cipher
|
||||||
libp2p_secio_select_best(order, propose_out->ciphers, propose_out->ciphers_size, propose_in->ciphers, propose_in->ciphers_size, &local_session->chosen_cipher);
|
if (libp2p_secio_select_best(order, propose_out->ciphers, propose_out->ciphers_size, propose_in->ciphers, propose_in->ciphers_size, &local_session->chosen_cipher) == 0)
|
||||||
|
goto exit;
|
||||||
// hash
|
// hash
|
||||||
libp2p_secio_select_best(order, propose_out->hashes, propose_out->hashes_size, propose_in->hashes, propose_in->hashes_size, &local_session->chosen_hash);
|
if (libp2p_secio_select_best(order, propose_out->hashes, propose_out->hashes_size, propose_in->hashes, propose_in->hashes_size, &local_session->chosen_hash) == 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
// prepare exchange of encryption parameters
|
// prepare exchange of encryption parameters
|
||||||
struct SecureSession remote_session;
|
struct SecureSession remote_session;
|
||||||
|
@ -614,6 +634,7 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
priv.data_size = private_key->der_length;
|
priv.data_size = private_key->der_length;
|
||||||
libp2p_secio_sign(&priv, (char*)char_buffer->buffer, char_buffer->buffer_size, &exchange_out->signature, &exchange_out->signature_size);
|
libp2p_secio_sign(&priv, (char*)char_buffer->buffer, char_buffer->buffer_size, &exchange_out->signature, &exchange_out->signature_size);
|
||||||
libp2p_utils_vector_free(char_buffer);
|
libp2p_utils_vector_free(char_buffer);
|
||||||
|
char_buffer = NULL;
|
||||||
|
|
||||||
exchange_out_protobuf_size = libp2p_secio_exchange_protobuf_encode_size(exchange_out);
|
exchange_out_protobuf_size = libp2p_secio_exchange_protobuf_encode_size(exchange_out);
|
||||||
exchange_out_protobuf = (unsigned char*)malloc(exchange_out_protobuf_size);
|
exchange_out_protobuf = (unsigned char*)malloc(exchange_out_protobuf_size);
|
||||||
|
@ -642,6 +663,7 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
if (!libp2p_secio_verify_signature(public_key, char_buffer->buffer, char_buffer->buffer_size, exchange_in->signature))
|
if (!libp2p_secio_verify_signature(public_key, char_buffer->buffer, char_buffer->buffer_size, exchange_in->signature))
|
||||||
goto exit;
|
goto exit;
|
||||||
libp2p_utils_vector_free(char_buffer);
|
libp2p_utils_vector_free(char_buffer);
|
||||||
|
char_buffer = NULL;
|
||||||
|
|
||||||
// 2.2 generate shared key NOTE: this was done above
|
// 2.2 generate shared key NOTE: this was done above
|
||||||
|
|
||||||
|
@ -679,6 +701,12 @@ int libp2p_secio_handshake(struct SecureSession* local_session, struct RsaPrivat
|
||||||
free(propose_out_bytes);
|
free(propose_out_bytes);
|
||||||
if (results != NULL)
|
if (results != NULL)
|
||||||
free(results);
|
free(results);
|
||||||
|
if (char_buffer != NULL)
|
||||||
|
libp2p_utils_vector_free(char_buffer);
|
||||||
|
if (public_key != NULL)
|
||||||
|
libp2p_crypto_public_key_free(public_key);
|
||||||
|
if (remote_peer_id != NULL)
|
||||||
|
free(remote_peer_id);
|
||||||
|
|
||||||
libp2p_secio_propose_free(propose_out);
|
libp2p_secio_propose_free(propose_out);
|
||||||
libp2p_secio_propose_free(propose_in);
|
libp2p_secio_propose_free(propose_in);
|
||||||
|
|
|
@ -13,12 +13,13 @@ int test_secio_handshake() {
|
||||||
char* orig_priv_key = "CAASqgkwggSmAgEAAoIBAQD0a4RI+bF/ov7IVOGSJ8dQfnK1DwM0gwVuJAd+3LXxIZEPZzsKIKia0TojDbTdLvOJ23wsaojTF/4bSzBK5otdAz8YSgez4vTRUV5pUqvCkK0dSJJ1DHTdrFUwvzlXuKbwNbvWyzjmKfeaE9a9YLzhrUIUTRvKyqhZXr++vMy3hw4fdtGUTJWeiqmoIuJWIZ1748Ff6LjcP7TdG7OvY4q+U9ilEJYdF4aM+TJY193zKp0GNWohunuVrtOUnL9VQaSSDbvGdFS1Mg9iCN6kRBQTHVQvFzvuEw/Y2LvoPH3yFG1zj6bDLWfOBhegy/6Zi6fi4E1UfgJNFN1sjWF+gZoHAgMBAAECggEBALTqBD9zuoMsJYQo99IT6X7WKZeE5i1vMYzF1Fp9iZpS6ylIkrW7WLFHXs3lblMtVoxazn2d2WrOXoLbU4KNROhy57fVy//FZMqufMBetc3NAqYjOmyy7KnLzj7Hu+0HO2GflEq3n4UV2TTNrGv+d7BfawLV1FV1TcjgzfKjkq/gMDCTPMgfT7lcF4TGSqv6Pgudp8RRn/R7EKOx+I8/XkJsZWP3XJ0zj4ciqDmKrX2j7wZMT8CH/8wfyg4NGk1+TN4xBB2CXgulIWJg5yhzu+JgbGnHEL/Ga+i40XJe+RnlKDpjQ+ZFyrOkmHpIldasjWNGFeKwLjzrDQfyDRwex5ECgYEA+fFGJ+zbi2YJwHDO/44PmvcoCWpho0ah7y+O5/LEVROTYEoNRqodLet+z+LMKDq/o2qTNaYJLiDGMBZzhqyJIFR5ZJ5MhgLloY1gL8s0a7KMWDbh7giiWSu5zqhB3Du8Tom+8bYZUxOL4zhzCGrFitRqiEIIjy1/c5qyRQZaZx8CgYEA+lf6tdO6kKiAOxm7sdZ3rEl4UGFY+tEqgivKwurLRIor0XDfhCKr1hCfsZggpR8SMLfjCuNEgKbceofcKMa8OtyDbMPRz0mYNkCELTUYA+r8Ib/LvleQApMcLn+TDNwEnGlglSrrF33RVAUK+i/WfSXUvZRVpLQpRmdAqHjJeBkCgYEA0+Zz/iFXOGW32slJFWxRWqYz8VeZk52saGY/l/I/9Yj1J2tgugo7VtUS3BiB0ZGNK3SNfaxYmBz9KYO/Sew5DYnQqTdz1SHboQ2FAMAcnznutlNBVFdJnKPvkX8g5yBV05gApFgoPECUFn2jOP2coMjZ0M97Bjgil9YNUWvDdS0CgYEA4beFs3+tzVRAGgl/tD7dNBgiRMchBTSmkSuO6+PrVmcGTxboUSk5qg7fDa9Ob9LuAcMrENwNHbpVPJ1WoeVePewpC14bxDxk4zWUd3ZRquaqYnud5obor4mYdUxNd+DAv447qQNDaLDmlkzdsuqDB9+eSzh9Z72RIYtjPwN5E7ECgYEAsbqkMZXfK1tTRfduX+7KOlPMfcSr29X6nuDglcna4dHec6FAOzp3xL2722nnFt6gygc7pErrm0m0Wd/6BMTb4T3+GYwkDiMjM2CsTZYjpzrUri/VfRR509rScxHVR0/1PTFWN0K0+VZbEAyXDbbs4opq40tW0dWtcKxaNlimMw8=";
|
char* orig_priv_key = "CAASqgkwggSmAgEAAoIBAQD0a4RI+bF/ov7IVOGSJ8dQfnK1DwM0gwVuJAd+3LXxIZEPZzsKIKia0TojDbTdLvOJ23wsaojTF/4bSzBK5otdAz8YSgez4vTRUV5pUqvCkK0dSJJ1DHTdrFUwvzlXuKbwNbvWyzjmKfeaE9a9YLzhrUIUTRvKyqhZXr++vMy3hw4fdtGUTJWeiqmoIuJWIZ1748Ff6LjcP7TdG7OvY4q+U9ilEJYdF4aM+TJY193zKp0GNWohunuVrtOUnL9VQaSSDbvGdFS1Mg9iCN6kRBQTHVQvFzvuEw/Y2LvoPH3yFG1zj6bDLWfOBhegy/6Zi6fi4E1UfgJNFN1sjWF+gZoHAgMBAAECggEBALTqBD9zuoMsJYQo99IT6X7WKZeE5i1vMYzF1Fp9iZpS6ylIkrW7WLFHXs3lblMtVoxazn2d2WrOXoLbU4KNROhy57fVy//FZMqufMBetc3NAqYjOmyy7KnLzj7Hu+0HO2GflEq3n4UV2TTNrGv+d7BfawLV1FV1TcjgzfKjkq/gMDCTPMgfT7lcF4TGSqv6Pgudp8RRn/R7EKOx+I8/XkJsZWP3XJ0zj4ciqDmKrX2j7wZMT8CH/8wfyg4NGk1+TN4xBB2CXgulIWJg5yhzu+JgbGnHEL/Ga+i40XJe+RnlKDpjQ+ZFyrOkmHpIldasjWNGFeKwLjzrDQfyDRwex5ECgYEA+fFGJ+zbi2YJwHDO/44PmvcoCWpho0ah7y+O5/LEVROTYEoNRqodLet+z+LMKDq/o2qTNaYJLiDGMBZzhqyJIFR5ZJ5MhgLloY1gL8s0a7KMWDbh7giiWSu5zqhB3Du8Tom+8bYZUxOL4zhzCGrFitRqiEIIjy1/c5qyRQZaZx8CgYEA+lf6tdO6kKiAOxm7sdZ3rEl4UGFY+tEqgivKwurLRIor0XDfhCKr1hCfsZggpR8SMLfjCuNEgKbceofcKMa8OtyDbMPRz0mYNkCELTUYA+r8Ib/LvleQApMcLn+TDNwEnGlglSrrF33RVAUK+i/WfSXUvZRVpLQpRmdAqHjJeBkCgYEA0+Zz/iFXOGW32slJFWxRWqYz8VeZk52saGY/l/I/9Yj1J2tgugo7VtUS3BiB0ZGNK3SNfaxYmBz9KYO/Sew5DYnQqTdz1SHboQ2FAMAcnznutlNBVFdJnKPvkX8g5yBV05gApFgoPECUFn2jOP2coMjZ0M97Bjgil9YNUWvDdS0CgYEA4beFs3+tzVRAGgl/tD7dNBgiRMchBTSmkSuO6+PrVmcGTxboUSk5qg7fDa9Ob9LuAcMrENwNHbpVPJ1WoeVePewpC14bxDxk4zWUd3ZRquaqYnud5obor4mYdUxNd+DAv447qQNDaLDmlkzdsuqDB9+eSzh9Z72RIYtjPwN5E7ECgYEAsbqkMZXfK1tTRfduX+7KOlPMfcSr29X6nuDglcna4dHec6FAOzp3xL2722nnFt6gygc7pErrm0m0Wd/6BMTb4T3+GYwkDiMjM2CsTZYjpzrUri/VfRR509rScxHVR0/1PTFWN0K0+VZbEAyXDbbs4opq40tW0dWtcKxaNlimMw8=";
|
||||||
char* orig_peer_id = "QmbTyKkUuv6yaSpTuCFq1Ft6Q3g4wTtFJk1BLGMPRdAEP8";
|
char* orig_peer_id = "QmbTyKkUuv6yaSpTuCFq1Ft6Q3g4wTtFJk1BLGMPRdAEP8";
|
||||||
size_t orig_peer_id_size = strlen(orig_peer_id);
|
size_t orig_peer_id_size = strlen(orig_peer_id);
|
||||||
struct RsaPrivateKey rsa_private_key = {0};
|
struct RsaPrivateKey* rsa_private_key = NULL;
|
||||||
unsigned char hashed[32];
|
unsigned char hashed[32];
|
||||||
size_t final_id_size = 1600;
|
size_t final_id_size = 1600;
|
||||||
unsigned char final_id[final_id_size];
|
unsigned char final_id[final_id_size];
|
||||||
|
|
||||||
struct PrivateKey* private_key = libp2p_crypto_private_key_new();
|
struct PrivateKey* private_key = NULL;
|
||||||
|
struct SecureSession secure_session = {0};
|
||||||
|
|
||||||
// 1) take the private key and turn it back into bytes (decode base 64)
|
// 1) take the private key and turn it back into bytes (decode base 64)
|
||||||
decode_base64_size = libp2p_crypto_encoding_base64_decode_size(strlen(orig_priv_key));
|
decode_base64_size = libp2p_crypto_encoding_base64_decode_size(strlen(orig_priv_key));
|
||||||
|
@ -33,16 +34,14 @@ int test_secio_handshake() {
|
||||||
|
|
||||||
// 2) take the bytes of the private key and turn it back into an RSA private key struct
|
// 2) take the bytes of the private key and turn it back into an RSA private key struct
|
||||||
//TODO: should verify that this key is RSA
|
//TODO: should verify that this key is RSA
|
||||||
if (!libp2p_crypto_encoding_x509_der_to_private_key(private_key->data, private_key->data_size, &rsa_private_key))
|
rsa_private_key = libp2p_crypto_rsa_rsa_private_key_new();
|
||||||
|
if (!libp2p_crypto_encoding_x509_der_to_private_key(private_key->data, private_key->data_size, rsa_private_key))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
// 2b) take the private key and fill in the public key DER
|
// 2b) take the private key and fill in the public key DER
|
||||||
if (!libp2p_crypto_rsa_private_key_fill_public_key(&rsa_private_key))
|
if (!libp2p_crypto_rsa_private_key_fill_public_key(rsa_private_key))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
|
||||||
struct SecureSession secure_session;
|
|
||||||
|
|
||||||
secure_session.host = "www.jmjatlanta.com";
|
secure_session.host = "www.jmjatlanta.com";
|
||||||
secure_session.port = 4001;
|
secure_session.port = 4001;
|
||||||
secure_session.traffic_type = TCP;
|
secure_session.traffic_type = TCP;
|
||||||
|
@ -53,13 +52,26 @@ int test_secio_handshake() {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!libp2p_secio_handshake(&secure_session, &rsa_private_key)) {
|
if (!libp2p_secio_handshake(&secure_session, rsa_private_key)) {
|
||||||
fprintf(stderr, "test_secio_handshake: Unable to do handshake\n");
|
fprintf(stderr, "test_secio_handshake: Unable to do handshake\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
retVal = 1;
|
retVal = 1;
|
||||||
exit:
|
exit:
|
||||||
|
if (secure_session.ephemeral_public_key != NULL)
|
||||||
|
free(secure_session.ephemeral_public_key);
|
||||||
|
if (secure_session.chosen_cipher != NULL)
|
||||||
|
free(secure_session.chosen_cipher);
|
||||||
|
if (secure_session.chosen_curve != NULL)
|
||||||
|
free(secure_session.chosen_curve);
|
||||||
|
if (secure_session.chosen_hash != NULL)
|
||||||
|
free(secure_session.chosen_hash);
|
||||||
|
if (private_key != NULL)
|
||||||
|
libp2p_crypto_private_key_free(private_key);
|
||||||
|
if (decode_base64 != NULL)
|
||||||
|
free(decode_base64);
|
||||||
|
if (rsa_private_key != NULL)
|
||||||
|
libp2p_crypto_rsa_rsa_private_key_free(rsa_private_key);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue