void cpDecodeSecret(const vlPoint vlPrivateKey, const vlPoint vlMessage, vlPoint d) { ecPoint q; ecUnpack(&q, vlMessage); ecMultiply(&q, vlPrivateKey); gfPack(q.x, d); } /* ecDecodeSecret */
void cpEncodeSecret(const vlPoint vlPublicKey, vlPoint vlMessage, vlPoint vlSecret) { ecPoint q; ecCopy(&q, &curve_point); ecMultiply(&q, vlSecret); ecPack(&q, vlMessage); ecUnpack(&q, vlPublicKey); ecMultiply(&q, vlSecret); gfPack(q.x, vlSecret); } /* cpMakeSecret */
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 ecPack (const ecPoint *p, vlPoint k) /* packs a curve point into a vlPoint */ { vlPoint a; if (p->x[0]) { gfPack (p->x, k); vlShortLshift (k, 1); vlShortSet (a, (word16) ecYbit (p)); vlAdd (k, a); } else if (p->y[0]) { vlShortSet (k, 1); } else { k[0] = 0; } } /* ecPack */