/** * eap_peer_tls_data_reassemble - Reassemble TLS data * @data: Data for TLS processing * @in_data: Next incoming TLS segment * @need_more_input: Variable for returning whether more input data is needed * to reassemble this TLS packet * Returns: Pointer to output data, %NULL on error or when more data is needed * for the full message (in which case, *need_more_input is also set to 1). * * This function reassembles TLS fragments. Caller must not free the returned * data buffer since an internal pointer to it is maintained. */ static const struct wpabuf * eap_peer_tls_data_reassemble( struct eap_ssl_data *data, const struct wpabuf *in_data, int *need_more_input) { *need_more_input = 0; if (data->tls_in_left > wpabuf_len(in_data) || data->tls_in) { /* Message has fragments */ int res = eap_peer_tls_reassemble_fragment(data, in_data); if (res) { if (res == 1) *need_more_input = 1; return NULL; } /* Message is now fully reassembled. */ } else { /* No fragments in this message, so just make a copy of it. */ data->tls_in_left = 0; data->tls_in = wpabuf_dup(in_data); if (data->tls_in == NULL) return NULL; } return data->tls_in; }
/** * eap_peer_tls_data_reassemble - Reassemble TLS data * @data: Data for TLS processing * @in_data: Next incoming TLS segment * @in_len: Length of in_data * @out_len: Variable for returning length of the reassembled message * @need_more_input: Variable for returning whether more input data is needed * to reassemble this TLS packet * Returns: Pointer to output data, %NULL on error or when more data is needed * for the full message (in which case, *need_more_input is also set to 1). * * This function reassembles TLS fragments. Caller must not free the returned * data buffer since an internal pointer to it is maintained. */ const u8 * eap_peer_tls_data_reassemble( struct eap_ssl_data *data, const u8 *in_data, size_t in_len, size_t *out_len, int *need_more_input) { *need_more_input = 0; if (data->tls_in_left > in_len || data->tls_in) { /* Message has fragments */ int res = eap_peer_tls_reassemble_fragment(data, in_data, in_len); if (res) { if (res == 1) *need_more_input = 1; return NULL; } /* Message is now fully reassembled. */ } else { /* No fragments in this message, so just make a copy of it. */ data->tls_in_left = 0; data->tls_in = os_malloc(in_len ? in_len : 1); if (data->tls_in == NULL) return NULL; os_memcpy(data->tls_in, in_data, in_len); data->tls_in_len = in_len; } *out_len = data->tls_in_len; return data->tls_in; }