static int fq_sign(element_ptr n) { int res; eptr r = n->data; res = element_sign(r->x); if (!res) return element_sign(r->y); return res; }
// Requires e to be a point on an elliptic curve. int element_from_bytes_compressed(element_ptr e, unsigned char *data) { curve_data_ptr cdp = (curve_data_ptr)e->field->data; point_ptr P = (point_ptr)e->data; int len; len = element_from_bytes(P->x, data); point_from_x(P, P->x, cdp->a, cdp->b); if (data[len]) { if (element_sign(P->y) < 0) element_neg(P->y, P->y); } else if (element_sign(P->y) > 0) { element_neg(P->y, P->y); } len++; return len; }
// Requires e to be a point on an elliptic curve. int element_to_bytes_compressed(unsigned char *data, element_ptr e) { point_ptr P = (point_ptr)e->data; int len; len = element_to_bytes(data, P->x); if (element_sign(P->y) > 0) { data[len] = 1; } else { data[len] = 0; } len++; return len; }
static int curve_sign(element_ptr e) { point_ptr p = (point_ptr)e->data; if (p->inf_flag) return 0; return element_sign(p->y); }