Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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);
}
Пример #4
0
// 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;
}