Пример #1
0
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 */
Пример #2
0
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 */
Пример #3
0
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 */