void cpSign(const vlPoint vlPrivateKey, const vlPoint k, const vlPoint vlMac, cpPair * sig) { ecPoint q; vlPoint tmp; ecCopy(&q, &curve_point); ecMultiply(&q, k); gfPack(q.x, sig->r); vlAdd(sig->r, vlMac); vlRemainder(sig->r, prime_order); if (sig->r[0] == 0) return; vlMulMod(tmp, vlPrivateKey, sig->r, prime_order); vlCopy(sig->s, k); if (vlGreater(tmp, sig->s)) vlAdd(sig->s, prime_order); vlSubtract(sig->s, tmp); } /* cpSign */
int cpVerify(const vlPoint vlPublicKey, const vlPoint vlMac, cpPair * sig) { ecPoint t1, t2; vlPoint t3, t4; ecCopy(&t1, &curve_point); ecMultiply(&t1, sig->s); ecUnpack(&t2, vlPublicKey); ecMultiply(&t2, sig->r); ecAdd(&t1, &t2); gfPack(t1.x, t4); vlRemainder(t4, prime_order); vlCopy(t3, sig->r); if (vlGreater(t4, t3)) vlAdd(t3, prime_order); vlSubtract(t3, t4); return vlEqual(t3, vlMac); } /* cpVerify */
void ecUnpack (ecPoint *p, const vlPoint k) /* unpacks a vlPoint into a curve point */ { int yb; vlPoint a; vlCopy (a, k); yb = a[0] ? a[1] & 1 : 0; vlShortRshift (a, 1); gfUnpack (p->x, a); if (p->x[0] || yb) { ecCalcY (p, yb); } else { p->y[0] = 0; } } /* ecUnpack */