diff options
Diffstat (limited to 'src/util/binascii.c')
| -rw-r--r-- | src/util/binascii.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/util/binascii.c b/src/util/binascii.c new file mode 100644 index 0000000..ae3f1ff --- /dev/null +++ b/src/util/binascii.c @@ -0,0 +1,43 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "binascii.h" +#include "util/memory.h" + +size_t binascii_blen(GEN i) { + pari_sp ltop = avma; + size_t result = (size_t)glength(binary_2k_nv(i, 8)); + avma = ltop; + return result; +} + +char *binascii_itob(GEN i, endian_e endianity) { + pari_sp ltop = avma; + GEN digits = binary_2k_nv(i, 8); + if (endianity == ENDIAN_LITTLE) { + digits = vecsmall_reverse(digits); + } + long blen = glength(digits); + char *result = try_malloc((size_t)blen); + for (long j = 1; j <= blen; ++j) { + result[j - 1] = (char)gel(digits, j); + } + + avma = ltop; + return result; +} + +GEN binascii_btoi(const char *bytes, size_t len, endian_e endianity) { + pari_sp ltop = avma; + GEN result = gen_0; + for (size_t i = 0; i < len; ++i) { + size_t index = i; + if (endianity == ENDIAN_LITTLE) { + index = (len - 1) - i; + } + result = addis(result, bytes[index]); + if (i < len - 1) result = shifti(result, 8); + } + return gerepileupto(ltop, result); +} |
