#include #include #include #include #include #include #include #include #include #include #include "vc_common.h" #define VCONN_NODES 3 #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) static void msg_remove_item(unsigned char *msg, uint16_t i, uint16_t c) { if (c - i - 1) memmove(msg + i * ECP_SIZE_DIR_ITEM, msg + (i + 1) * ECP_SIZE_DIR_ITEM, (c - i - 1) * ECP_SIZE_DIR_ITEM); } static void hrw_select(unsigned char *msg, uint16_t count, ecp_ecdh_public_t *pub, ecp_ecdh_public_t *hrw_pub, ecp_ecdh_public_t vconn_pub[], size_t *_vconn_size, ecp_tr_addr_t *addr) { unsigned char *_msg = msg; unsigned char hash[SHA_DIGEST_LENGTH]; unsigned char hrw_hash[SHA_DIGEST_LENGTH]; ecp_ecdh_public_t hash_pub[2]; size_t vconn_size = *_vconn_size; ECPDirItem dir_item; SHA_CTX ctx; int i, hrw_i; if (count == 0) return; memset(hrw_hash, 0, sizeof(hrw_hash)); memcpy(&hash_pub[0], pub, sizeof(ecp_ecdh_public_t)); for (i=0; isock); ecp_node_init(&node, &hrw_pub, &addr); rv = ecp_vconn_open(vconn, vlink, &node); printf("ecp_vconn_open RV:%d\n", rv); return ECP_OK; } int vc_open_outb(ECPConnection *conn, unsigned char *msg, uint16_t count, ecp_ecdh_public_t *remote_pub) { ecp_ecdh_public_t vconn_pub[VCONN_NODES]; ecp_ecdh_public_t hrw_pub; ecp_tr_addr_t addr; ECPNode node; ECPVConnOutb *vconn; size_t vconn_size; int rv; vconn_size = VCONN_NODES - 1; hrw_select(msg, count, remote_pub, &hrw_pub, vconn_pub, &vconn_size, &addr); memcpy(&vconn_pub[vconn_size], &hrw_pub, sizeof(ecp_ecdh_public_t)); vconn_size++; vconn = malloc(sizeof(ECPVConnOutb) * vconn_size); if (vconn == NULL) return ECP_ERR_ALLOC; ecp_vconn_init(vconn, vconn_pub, vconn_size, conn->sock); ecp_node_init(&node, remote_pub, &addr); rv = ecp_vconn_open(vconn, conn, &node); printf("ecp_vconn_open RV:%d\n", rv); return ECP_OK; }