async def _initEqProof(self, schemaId, c1: PrimaryClaim,
                           revealedAttrs: Sequence[str], m1Tilde, m2Tilde, claimAttributes: Dict[str, ClaimAttributeValues]) \
            -> PrimaryEqualInitProof:
        m2Tilde = m2Tilde if m2Tilde else cmod.integer(
            cmod.randomBits(LARGE_MVECT))
        revealedAttrs, unrevealedAttrs = splitRevealedAttrs(
            claimAttributes, [a.name for a in revealedAttrs])
        mtilde = self._getMTilde(unrevealedAttrs)

        Ra = cmod.integer(cmod.randomBits(LARGE_VPRIME))
        pk = await self._wallet.getPublicKey(ID(schemaId=schemaId))

        A, e, v = c1.A, c1.e, c1.v
        Aprime = A * (pk.S**Ra) % pk.N
        vprime = (v - e * Ra)
        eprime = e - (2**LARGE_E_START)

        etilde = cmod.integer(cmod.randomBits(LARGE_ETILDE))
        vtilde = cmod.integer(cmod.randomBits(LARGE_VTILDE))

        Rur = 1 % pk.N
        for k, value in unrevealedAttrs.items():
            if k in claimAttributes:
                Rur = Rur * (pk.R[k]**mtilde[k])
        Rur *= pk.Rms**m1Tilde
        Rur *= pk.Rctxt**m2Tilde

        # T = ((Aprime ** etilde) * Rur * (pk.S ** vtilde)) % pk.N
        T = calcTeq(pk, Aprime, etilde, vtilde, mtilde, m1Tilde, m2Tilde,
                    unrevealedAttrs.keys())

        return PrimaryEqualInitProof(c1, Aprime, T, etilde, eprime, vtilde,
                                     vprime, mtilde, m1Tilde, m2Tilde,
                                     unrevealedAttrs.keys(), revealedAttrs)
    async def _verifyEquality(self, schemaKey, cH, proof: PrimaryEqualProof,
                              allRevealedAttrs):
        THat = []
        pk = await self._wallet.getPublicKey(ID(schemaKey))
        attrNames = (await self._wallet.getSchema(ID(schemaKey))).attrNames
        unrevealedAttrNames = set(attrNames) - set(proof.revealedAttrNames)

        T1 = calcTeq(pk, proof.Aprime, proof.e, proof.v, proof.m, proof.m1,
                     proof.m2, unrevealedAttrNames)

        Rar = 1 % pk.N
        for attrName in proof.revealedAttrNames:
            Rar *= pk.R[str(attrName)]**allRevealedAttrs[attrName]
        Rar *= proof.Aprime**(2**LARGE_E_START)
        T2 = (pk.Z / Rar)**(-1 * cH) % pk.N
        T = T1 * T2 % pk.N

        THat.append(T)
        return THat