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