void fp12_write_bin(uint8_t *bin, int len, fp12_t a, int pack) { fp12_t t; fp12_null(t); TRY { fp12_new(t); if (pack) { if (len != 8 * FP_BYTES) { THROW(ERR_NO_BUFFER); } fp12_pck(t, a); fp2_write_bin(bin, 2 * FP_BYTES, a[0][1], 0); fp2_write_bin(bin + 2 * FP_BYTES, 2 * FP_BYTES, a[0][2], 0); fp2_write_bin(bin + 4 * FP_BYTES, 2 * FP_BYTES, a[1][0], 0); fp2_write_bin(bin + 6 * FP_BYTES, 2 * FP_BYTES, a[1][2], 0); } else { if (len != 12 * FP_BYTES) { THROW(ERR_NO_BUFFER); } fp6_write_bin(bin, 6 * FP_BYTES, a[0]); fp6_write_bin(bin + 6 * FP_BYTES, 6 * FP_BYTES, a[1]); } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { fp12_free(t); } }
void fp6_write_bin(uint8_t *bin, int len, fp6_t a) { if (len != 6 * FP_BYTES) { THROW(ERR_NO_BUFFER); } fp2_write_bin(bin, 2 * FP_BYTES, a[0], 0); fp2_write_bin(bin + 2 * FP_BYTES, 2 * FP_BYTES, a[1], 0); fp2_write_bin(bin + 4 * FP_BYTES, 2 * FP_BYTES, a[2], 0); }
void ep2_write_bin(uint8_t *bin, int len, ep2_t a, int pack) { ep2_t t; ep2_null(t); if (ep2_is_infty(a)) { if (len != 1) { THROW(ERR_NO_BUFFER); } else { bin[0] = 0; return; } } TRY { ep2_new(t); ep2_norm(t, a); if (pack) { if (len < 2 * FP_BYTES + 1) { THROW(ERR_NO_BUFFER); } else { ep2_pck(t, t); bin[0] = 2 | fp_get_bit(t->y[0], 0); fp2_write_bin(bin + 1, 2 * FP_BYTES, t->x, 0); } } else { if (len < 4 * FP_BYTES + 1) { THROW(ERR_NO_BUFFER); } else { bin[0] = 4; fp2_write_bin(bin + 1, 2 * FP_BYTES, t->x, 0); fp2_write_bin(bin + 2 * FP_BYTES + 1, 2 * FP_BYTES, t->y, 0); } } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { ep2_free(t); } }