in src/schnorr.c [300:343]
int SCHNORR_D_verify(const octet *R, const octet *V, const octet *C, const octet *E, const octet *T, const octet *U)
{
ECP_SECP256K1 G;
ECP_SECP256K1 ECPR;
ECP_SECP256K1 ECPV;
ECP_SECP256K1 ECPC;
BIG_256_56 t;
BIG_256_56 u;
// Read octets
if (!ECP_SECP256K1_fromOctet(&ECPV, V))
{
return SCHNORR_INVALID_ECP;
}
if (!ECP_SECP256K1_fromOctet(&ECPR, R))
{
return SCHNORR_INVALID_ECP;
}
if (!ECP_SECP256K1_fromOctet(&ECPC, C))
{
return SCHNORR_INVALID_ECP;
}
BIG_256_56_fromBytesLen(t, T->val, T->len);
BIG_256_56_fromBytesLen(u, U->val, U->len);
// Compute verification t.R + u.G + e.V
ECP_SECP256K1_generator(&G);
ECP_SECP256K1_mul2(&ECPR, &G, t, u);
BIG_256_56_fromBytesLen(t, E->val, E->len);
ECP_SECP256K1_mul(&ECPV, t);
ECP_SECP256K1_add(&ECPR, &ECPV);
if (!ECP_SECP256K1_equals(&ECPC, &ECPR))
{
return SCHNORR_FAIL;
}
return SCHNORR_OK;
}