ZZ BankTool::identifyDoubleSpender(const Coin& coin1, const ZZ &tPrime2, const ZZ& rValue2) const { // Should probably check that the R values are different ZZ mod = coin1.getCashGroup()->getModulus(); ZZ order = coin1.getCashGroup()->getOrder(); ZZ t1 = coin1.getTPrime(); ZZ t2 = tPrime2; ZZ r1 = coin1.getR(); ZZ r2 = rValue2; if (r2 > r1) { NTL::swap(r2, r1); NTL::swap(t2, t1); } ZZ exp = InvMod(r1 - r2, order); ZZ num = PowerMod(t2, r1, mod); ZZ denom = InvMod(PowerMod(t1, r2, mod), mod); ZZ base = MulMod(num, denom, mod); ZZ publicKeyUser = PowerMod(base, exp, mod); return publicKeyUser; }
ZZ BankTool::identifyDoubleSpender(const Coin& coin1, const Coin& coin2) const { return identifyDoubleSpender(coin1, coin2.getTPrime(), coin2.getR()); }