Пример #1
0
// Get connection parameters. Returns 1 if successful.
static int authGetConnectionParams(struct s_auth_state *authstate, int64_t *seq, int64_t *flags) {
	if(authIsCompleted(authstate)) {
		*seq = utilReadInt64(authstate->remote_seq);
		*flags = utilReadInt64(authstate->remote_flags);
		return 1;
	}
	else {
		return 0;
	}
}
Пример #2
0
// decode packet
static int packetDecode(struct s_packet_data *data, const unsigned char *pbuf, const int pbuf_size, struct s_crypto *ctx, struct s_seq_state *seqstate) {
	unsigned char dec_buf[pbuf_size];
	int len;

	// decrypt packet
	if(pbuf_size < (packet_PEERID_SIZE + packet_HMAC_SIZE + packet_IV_SIZE)) { return 0; }
	len = cryptoDec(ctx, dec_buf, pbuf_size, &pbuf[packet_PEERID_SIZE], (pbuf_size - packet_PEERID_SIZE), packet_HMAC_SIZE, packet_IV_SIZE);
	if(len < packet_CRHDR_SIZE) { return 0; };

	// get packet data
	data->peerid = packetGetPeerID(pbuf);
	data->seq = utilReadInt64(&dec_buf[packet_CRHDR_SEQ_START]);
	if(seqstate != NULL) if(!seqVerify(seqstate, data->seq)) { return 0; }
	data->pl_options = dec_buf[packet_CRHDR_PLOPT_START];
	data->pl_type = dec_buf[packet_CRHDR_PLTYPE_START];
	data->pl_length = utilReadInt16(&dec_buf[packet_CRHDR_PLLEN_START]);
	if(!(data->pl_length > 0)) {
		data->pl_length = 0;
		return 0;
	}
	if(len < (packet_CRHDR_SIZE + data->pl_length)) { return 0; }
	if(data->pl_length > data->pl_buf_size) { return 0; }
	memcpy(data->pl_buf, &dec_buf[packet_CRHDR_SIZE], data->pl_length);

	// return length of decoded payload
	return (data->pl_length);
}