int p2psecStart(P2PSEC_CTX *p2psec) { if((!p2psec->started) && (p2psec->key_loaded) && (p2psec->dh_loaded)) { if(peermgtCreate(&p2psec->mgt, p2psec->peer_count, p2psec->auth_count, &p2psec->nk, &p2psec->dh)) { peermgtSetLoopback(&p2psec->mgt, p2psec->loopback_enable); peermgtSetFastauth(&p2psec->mgt, p2psec->fastauth_enable); peermgtSetFragmentation(&p2psec->mgt, p2psec->fragmentation_enable); peermgtSetNetID(&p2psec->mgt, p2psec->netname, p2psec->netname_len); peermgtSetPassword(&p2psec->mgt, p2psec->password, p2psec->password_len); peermgtSetFlags(&p2psec->mgt, p2psec->flags); p2psec->started = 1; return 1; } } return 0; }
// Create peer manager object. static int peermgtCreate(struct s_peermgt *mgt, const int peer_slots, const int auth_slots, struct s_nodekey *local_nodekey, struct s_dh_state *dhstate) { int tnow = utilGetTime(); const char *defaultid = "default"; struct s_peermgt_data *data_mem; struct s_crypto *ctx_mem; if((peer_slots > 0) && (auth_slots > 0) && (peermgtSetNetID(mgt, defaultid, 7))) { data_mem = malloc(sizeof(struct s_peermgt_data) * (peer_slots + 1)); if(data_mem != NULL) { ctx_mem = malloc(sizeof(struct s_crypto) * (peer_slots + 1)); if(ctx_mem != NULL) { if(cryptoCreate(ctx_mem, (peer_slots + 1))) { if(dfragCreate(&mgt->dfrag, peermgt_MSGSIZE_MIN, peermgt_FRAGBUF_COUNT)) { if(authmgtCreate(&mgt->authmgt, &mgt->netid, auth_slots, local_nodekey, dhstate)) { if(nodedbCreate(&mgt->nodedb, ((peer_slots * 8) + 1))) { if(mapCreate(&mgt->map, (peer_slots + 1), nodeid_SIZE, 1)) { mgt->nodekey = local_nodekey; mgt->data = data_mem; mgt->ctx = ctx_mem; mgt->lastconnect = tnow; mgt->rrmsg.msg = mgt->rrmsgbuf; if(peermgtInit(mgt)) { return 1; } mgt->nodekey = NULL; mgt->data = NULL; mgt->ctx = NULL; mapDestroy(&mgt->map); } nodedbDestroy(&mgt->nodedb); } authmgtDestroy(&mgt->authmgt); } dfragDestroy(&mgt->dfrag); } cryptoDestroy(ctx_mem, (peer_slots + 1)); } free(ctx_mem); } free(data_mem); } } return 0; }
void p2psecSetNetname(P2PSEC_CTX *p2psec, const char *netname, const int netname_len) { int len; if(netname_len < 1024) { len = netname_len; } else { len = 1023; } memset(p2psec->netname, 0, 1024); if(len > 0) { utilStringFilter(p2psec->netname, netname, len); p2psec->netname_len = len; } else { memcpy(p2psec->netname, "default", 7); p2psec->netname_len = 7; } if(p2psec->started) peermgtSetNetID(&p2psec->mgt, p2psec->netname, p2psec->netname_len); }
// Initialize peer manager object. static int peermgtInit(struct s_peermgt *mgt) { const char *defaultpw = "default"; int i; int s = mapGetMapSize(&mgt->map); struct s_peeraddr empty_addr; struct s_nodeid *local_nodeid = &mgt->nodekey->nodeid; mgt->msgsize = 0; mgt->loopback = 0; mgt->outmsg.len = 0; mgt->outmsgbroadcast = 0; mgt->outmsgbroadcastcount = 0; mgt->rrmsg.len = 0; mgt->rrmsgpeerid = 0; mgt->rrmsgusetargetaddr = 0; mgt->fragoutpeerid = 0; mgt->fragoutcount = 0; mgt->fragoutsize = 0; mgt->fragoutpos = 0; mgt->localflags = 0; for(i=0; i<s; i++) { mgt->data[i].state = peermgt_STATE_INVALID; } memset(empty_addr.addr, 0, peeraddr_SIZE); mapInit(&mgt->map); authmgtReset(&mgt->authmgt); nodedbInit(&mgt->nodedb); nodedbSetMaxAge(&mgt->nodedb, peermgt_NEWCONNECT_MAX_AGE); if(peermgtNew(mgt, local_nodeid, &empty_addr) == 0) { // ID 0 should always represent local NodeID if(peermgtGetID(mgt, local_nodeid) == 0) { if(peermgtSetNetID(mgt, defaultpw, 7) && peermgtSetPassword(mgt, defaultpw, 7)) { mgt->data[0].state = peermgt_STATE_COMPLETE; return 1; } } } return 0; }