From 5ff7c1bd1af650722a6d7fb3135b5dfc51b8c9d1 Mon Sep 17 00:00:00 2001 From: hasufell Date: Sun, 8 Jun 2014 16:17:01 +0200 Subject: [PATCH] ASCII->POLY: improve performance wrt #6 It appears that the strcat call was the culprit here and caused non-linear run-time growth of the encryption algorithm. Replacing it with memcpy fixed this. --- src/ntru_ascii_poly.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ntru_ascii_poly.c b/src/ntru_ascii_poly.c index 7bb27a0..9c11458 100644 --- a/src/ntru_ascii_poly.c +++ b/src/ntru_ascii_poly.c @@ -103,26 +103,29 @@ ascii_to_bin_poly_arr(const string *to_poly, const ntru_params *params) char *cur = to_poly->ptr; char *out = ntru_malloc(CHAR_SIZE * (to_poly->len * ASCII_BITS + 1)); uint32_t polyc = 0; + size_t out_len = 0; fmpz_poly_t **poly_array; *out = '\0'; for (uint32_t i = 0; i < to_poly->len; i++) { char *tmp_string = get_int_to_bin_str((int)(*cur)); - strcat(out, tmp_string); + memcpy(out + out_len, tmp_string, ASCII_BITS); + out_len += ASCII_BITS; cur++; free(tmp_string); } + out[out_len] = '\0'; poly_array = ntru_malloc(sizeof(**poly_array) * (strlen(out) / params->N + 1)); - for (uint32_t i = 0; i < strlen(out); i += params->N) { + for (uint32_t i = 0; i < out_len; i += params->N) { char chunk[params->N + 1]; size_t real_chunk_size; real_chunk_size = - (strlen(out + i) > params->N) ? params->N : strlen(out + i); + (out_len - i > params->N) ? params->N : out_len - i; memcpy(chunk, out + i, real_chunk_size); chunk[real_chunk_size] = '\0';