/* * Compress twisted Edwards curve point by compressing the x-coordinate to its sign. */ void ed_pck(ed_t r, const ed_t p) { fp_copy(r->y, p->y); int b = fp_get_bit(p->x, 0); fp_zero(r->x); fp_set_bit(r->x, 0, b); fp_set_dig(r->z, 1); r->norm = 1; }
void fp2_pck(fp2_t c, fp2_t a) { int b = fp_get_bit(a[1], 0); if (fp2_test_uni(c)) { fp_copy(c[0], a[0]); fp_zero(c[1]); fp_set_bit(c[1], 0, b); } else { fp2_copy(c, a); } }
void fp2_read_bin(fp2_t a, uint8_t *bin, int len) { if (len != FP_BYTES + 1 && len != 2 * FP_BYTES) { THROW(ERR_NO_BUFFER); } if (len == FP_BYTES + 1) { fp_read_bin(a[0], bin, FP_BYTES); fp_set_bit(a[1], 0, bin[FP_BYTES]); fp2_upk(a, a); } if (len == 2 * FP_BYTES) { fp_read_bin(a[0], bin, FP_BYTES); fp_read_bin(a[1], bin + FP_BYTES, FP_BYTES); } }
void ed_read_bin(ed_t a, const uint8_t *bin, int len) { if (len == 1) { if (bin[0] == 0) { ed_set_infty(a); return; } else { THROW(ERR_NO_BUFFER); return; } } if (len != (FP_BYTES + 1) && len != (2 * FP_BYTES + 1)) { THROW(ERR_NO_BUFFER); return; } a->norm = 1; fp_set_dig(a->z, 1); fp_read_bin(a->y, bin + 1, FP_BYTES); if (len == FP_BYTES + 1) { switch(bin[0]) { case 2: fp_zero(a->x); break; case 3: fp_zero(a->x); fp_set_bit(a->x, 0, 1); break; default: THROW(ERR_NO_VALID); break; } ed_upk(a, a); } if (len == 2 * FP_BYTES + 1) { if (bin[0] == 4) { fp_read_bin(a->x, bin + FP_BYTES + 1, FP_BYTES); } else { THROW(ERR_NO_VALID); } } #if ED_ADD == EXTND ed_projc_to_extnd(a, a->x, a->y, a->z); #endif }
void ep2_read_bin(ep2_t a, uint8_t *bin, int len) { if (len == 1) { if (bin[0] == 0) { ep2_set_infty(a); return; } else { THROW(ERR_NO_BUFFER); return; } } if (len != (2 * FP_BYTES + 1) && len != (4 * FP_BYTES + 1)) { THROW(ERR_NO_BUFFER); return; } a->norm = 1; fp_set_dig(a->z[0], 1); fp_zero(a->z[1]); fp2_read_bin(a->x, bin + 1, 2 * FP_BYTES); if (len == 2 * FP_BYTES + 1) { switch(bin[0]) { case 2: fp2_zero(a->y); break; case 3: fp2_zero(a->y); fp_set_bit(a->y[0], 0, 1); fp_zero(a->y[1]); break; default: THROW(ERR_NO_VALID); break; } ep2_upk(a, a); } if (len == 4 * FP_BYTES + 1) { if (bin[0] == 4) { fp2_read_bin(a->y, bin + 2 * FP_BYTES + 1, 2 * FP_BYTES); } else { THROW(ERR_NO_VALID); } } }