TEST(Integer, OpenModInverse) { for(int i=0; i<10; i++) { Integer p = Integer::GetRandomInteger(1024, true); Integer a = Integer::GetRandomInteger(0, p); Integer na = a * Integer(-1); ASSERT_EQ(na, a - (2*a)); ASSERT_EQ((a-p)%p, a); ASSERT_EQ((a-(40*p))%p, a); Integer inv = a.ModInverse(p); Integer out = (a*inv)%p; ASSERT_TRUE(a > 0); ASSERT_TRUE(p > a); qDebug() << "a" << a.GetByteArray().toHex(); qDebug() << "p" << p.GetByteArray().toHex(); qDebug() << "out" << out.GetByteArray().toHex(); ASSERT_EQ(Integer(1), out); } }
CompositeIntegerGroup::CompositeIntegerGroup(Integer n) : _n(n) { // We pick the generator deterministically n Hash *hash = CryptoFactory::GetInstance().GetLibrary()->GetHashAlgorithm(); QByteArray seed = hash->ComputeHash(n.GetByteArray()); for(_s=3; ; _s = _s+1) { if(!_s.IsPrime()) continue; _p = (2 * _s * _n) + 1; if(_p.IsPrime()) break; } // Set g to some random element Integer g, h; const Integer e_test = 2*_s; for(Integer i=0; ; i = i+1) { h = (Integer(seed) + i) % _p; // Make sure that g generates a subgroup that is bigger // than order 2 and s and smaller than order P. // Since we do not know the factorization of n=qr, // we might be generating a subgroup of order q or r. if((g = h.Pow(e_test, _p)) != 1) break; } _g = Element(new IntegerElementData(g)); /* qDebug() << "_p" << _p.GetByteArray().toHex(); qDebug() << "_s" << _s.GetByteArray().toHex(); */ };
TEST(Integer, CppModInverse) { for(int i=0; i<10; i++) { Integer p = Integer::GetRandomInteger(1024, true); Integer a = Integer::GetRandomInteger(0, p); Integer inv = a.ModInverse(p); Integer out = (a*inv)%p; ASSERT_TRUE(a > 0); ASSERT_TRUE(p > a); qDebug() << "a" << a.GetByteArray().toHex(); qDebug() << "p" << p.GetByteArray().toHex(); qDebug() << "out" << out.GetByteArray().toHex(); ASSERT_EQ(Integer(1), out); } }
CppECGroup::CppECGroup(const Integer &p, const Integer &q, const Integer &a, const Integer &b, const Integer &gx, const Integer &gy) : _curve(ToCppInteger(p), ToCppInteger(a), ToCppInteger(b)), _q(q), _g(ToCppInteger(gx), ToCppInteger(gy)), _field_bytes(p.GetByteArray().count()) { /* qDebug() << " p" << p.GetByteArray().toHex(); qDebug() << " a" << a.GetByteArray().toHex(); qDebug() << " b" << b.GetByteArray().toHex(); qDebug() << "gx" << gx.GetByteArray().toHex(); qDebug() << "gy" << gy.GetByteArray().toHex(); */ Q_ASSERT(ToCppInteger(p) == _curve.FieldSize()); };
Zr PairingGroup::IntegerToZr(const Integer &in) const { mpz_t z; mpz_init(z); QByteArray b = in.GetByteArray().toHex(); const char *bytes = b.constData(); int ret; if((ret = gmp_sscanf(bytes, "%Zx", z)) != 1) { //qDebug() << "Bad string of len" << b.count() << ":" << bytes; //qDebug() << "Read" << ret; qFatal("Could not convert integer"); } Zr e(*_pairing, z); Q_ASSERT(e.isElementPresent()); mpz_clear(z); return e; }
QVariant SigmaProof::IntegerToVariant(Integer i) const { return QVariant(i.GetByteArray()); }