int SCHNORR_D_verify()

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;
}