// 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; } }
// 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); }