PairingGroup::PairingGroup(GroupSize s) : _size(s) { switch(s) { case TESTING_128: _param_str = QByteArray(_param_bytes_128); break; case TESTING_256: _param_str = QByteArray(_param_bytes_256); break; case PRODUCTION_512: _param_str = QByteArray(_param_bytes_512); break; case PRODUCTION_768: _param_str = QByteArray(_param_bytes_768); break; case PRODUCTION_1024: _param_str = QByteArray(_param_bytes_1024); break; case PRODUCTION_1280: _param_str = QByteArray(_param_bytes_1280); break; case PRODUCTION_1536: _param_str = QByteArray(_param_bytes_1536); break; default: qFatal("Unknown parameter type"); } _pairing = QSharedPointer<Pairing>(new Pairing(_param_str.constData(), _param_str.count())); // Maxlen = 32 kb const int maxlen = 1024*32; int ret; QByteArray buf(maxlen, 0); mpz_t p, q; mpz_init(p); mpz_init(q); if((ret = gmp_sscanf(_param_str, "type a q %Zd h %*Zd r %Zd", p, q)) != 2) qFatal("gmp_sscanf failed"); // PBC calls the field size "q" while we // call it p. This is the field size of G1 and G2 in a type-A pairing. // The field size for GT is (field_size)^2 if((ret = gmp_snprintf(buf.data(), buf.count(), "%Zx", p)) >= maxlen) qFatal("gmp_snprintf failed"); _field = Integer(QByteArray::fromHex(buf.left(ret))); // PBC calls the order "r", while we call it "q" if((ret = gmp_snprintf(buf.data(), buf.count(), "%Zx", q)) >= maxlen) qFatal("gmp_snprintf failed"); _order = Integer(QByteArray::fromHex(buf.left(ret))); mpz_clear(p); mpz_clear(q); Q_ASSERT(_pairing->isPairingPresent()); }
static E_GMP_RSA_CTX *e_gmp_get_rsa(RSA *rsa) { E_GMP_RSA_CTX *hptr = RSA_get_ex_data(rsa, hndidx_rsa); if (hptr) return hptr; hptr = OPENSSL_malloc(sizeof(E_GMP_RSA_CTX)); if (!hptr) return NULL; /* * These inits could probably be replaced by more intelligent mpz_init2() * versions, to reduce malloc-thrashing. */ mpz_init(hptr->n); mpz_init(hptr->d); mpz_init(hptr->e); mpz_init(hptr->p); mpz_init(hptr->q); mpz_init(hptr->dmp1); mpz_init(hptr->dmq1); mpz_init(hptr->iqmp); mpz_init(hptr->r0); mpz_init(hptr->r1); mpz_init(hptr->I0); mpz_init(hptr->m1); if (!bn2gmp(rsa->n, hptr->n) || !bn2gmp(rsa->e, hptr->e)) goto err; if (!rsa->p || !rsa->q || !rsa->d || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) { hptr->public_only = 1; return hptr; } if (!bn2gmp(rsa->d, hptr->d) || !bn2gmp(rsa->p, hptr->p) || !bn2gmp(rsa->q, hptr->q) || !bn2gmp(rsa->dmp1, hptr->dmp1) || !bn2gmp(rsa->dmq1, hptr->dmq1) || !bn2gmp(rsa->iqmp, hptr->iqmp)) goto err; hptr->public_only = 0; RSA_set_ex_data(rsa, hndidx_rsa, hptr); return hptr; err: mpz_clear(hptr->n); mpz_clear(hptr->d); mpz_clear(hptr->e); mpz_clear(hptr->p); mpz_clear(hptr->q); mpz_clear(hptr->dmp1); mpz_clear(hptr->dmq1); mpz_clear(hptr->iqmp); mpz_clear(hptr->r0); mpz_clear(hptr->r1); mpz_clear(hptr->I0); mpz_clear(hptr->m1); OPENSSL_free(hptr); return NULL; }
int main(int argc, char *argv[]) { int ans; char *str, *strout; fmpz_poly_t zpoly; fmpz_poly_q_t qpoly1; mpz_t mpzzero, mpzone, mpztwo; mpq_t mpqzero, mpqone, mpqtwo, mpqtwoinv; FLINT_TEST_INIT(state); flint_printf("all... "); fflush(stdout); /* Accessing numerator and denominator ***********************************/ fmpz_poly_q_init(qpoly1); fmpz_poly_q_set_str(qpoly1, "2 -1 1/2 0 1"); str = "2 -1 1"; strout = fmpz_poly_get_str(fmpz_poly_q_numref(qpoly1)); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_numref: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); flint_printf(" qpoly1 = \""), fmpz_poly_q_print(qpoly1), flint_printf("\"\n"); abort(); } fmpz_poly_q_clear(qpoly1); flint_free(strout); fmpz_poly_q_init(qpoly1); fmpz_poly_q_set_str(qpoly1, "2 -1 1/2 0 1"); str = "2 0 1"; strout = fmpz_poly_get_str(fmpz_poly_q_denref(qpoly1)); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_denref: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); flint_free(strout); fmpz_poly_q_init(qpoly1); fmpz_poly_init(zpoly); fmpz_poly_q_set_str(qpoly1, "2 -1 1/2 0 1"); fmpz_poly_set(zpoly, fmpz_poly_q_numref(qpoly1)); str = "2 -1 1"; strout = fmpz_poly_get_str(zpoly); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_get_num: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_clear(zpoly); flint_free(strout); fmpz_poly_q_init(qpoly1); fmpz_poly_init(zpoly); fmpz_poly_q_set_str(qpoly1, "2 -1 1/2 0 1"); fmpz_poly_set(zpoly, fmpz_poly_q_denref(qpoly1)); str = "2 0 1"; strout = fmpz_poly_get_str(zpoly); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_get_den: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_clear(zpoly); flint_free(strout); fmpz_poly_q_init(qpoly1); fmpz_poly_init(zpoly); fmpz_poly_q_set_str(qpoly1, "1 1/1 1"); fmpz_poly_set_str(zpoly, "2 0 1"); fmpz_poly_set(fmpz_poly_q_numref(qpoly1), zpoly); str = "2 0 1"; strout = fmpz_poly_get_str(fmpz_poly_q_numref(qpoly1)); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_set_num: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_clear(zpoly); flint_free(strout); fmpz_poly_q_init(qpoly1); fmpz_poly_init(zpoly); fmpz_poly_q_set_str(qpoly1, "1 1/1 1"); fmpz_poly_set_str(zpoly, "2 0 1"); fmpz_poly_set(fmpz_poly_q_denref(qpoly1), zpoly); str = "2 0 1"; strout = fmpz_poly_get_str(fmpz_poly_q_denref(qpoly1)); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_set_den: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_clear(zpoly); flint_free(strout); /* Canonicalise **********************************************************/ fmpz_poly_q_init(qpoly1); str = "2 -1 1/2 0 1"; fmpz_poly_q_set_str(qpoly1, str); strout = fmpz_poly_q_get_str(qpoly1); ans = !strcmp(str, strout); if (!ans) { flint_printf("test_canonicalize: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } fmpz_poly_q_clear(qpoly1); flint_free(strout); fmpz_poly_q_init(qpoly1); str = "2 -1 -1/2 0 1"; fmpz_poly_q_set_str(qpoly1, "2 1 1/2 0 -1"); strout = fmpz_poly_q_get_str(qpoly1); ans = !strcmp("2 -1 -1/2 0 1", strout); if (!ans) { flint_printf("test_canonicalize: failed\n"); flint_printf(" Expected \"%s\", got \"%s\"\n", str, strout); abort(); } flint_free(strout); fmpz_poly_q_clear(qpoly1); /* Initialization, memory management and basic operations ****************/ test_set("0", "0"); test_set("0/1 1", "0"); test_set("3 -1 0 1/2 0 1", "3 -1 0 1/2 0 1"); test_set("3 -1 0 1/2 1 1", "2 -1 1"); test_set_si(-1, "1 -1"); test_set_si(13, "1 13"); test_set_si(0, "0"); test_swap("3 -1 0 1/2 0 1", "1 2/1 3", "1 2/1 3", "3 -1 0 1/2 0 1"); test_zero("0", "0"); test_zero("0/1 1", "0"); test_zero("3 -1 0 1/2 0 1", "0"); test_neg("0", "0"); test_neg("1 1/1 2", "1 -1/1 2"); test_neg("3 -1 0 1/2 0 1", "3 1 0 -1/2 0 1"); test_inv("1 1/1 2", "1 2"); test_inv("3 -1 0 1/2 0 1", "2 0 1/3 -1 0 1"); test_inv("3 -1 0 -1/2 0 1", "2 0 -1/3 1 0 1"); test_inv_inplace("1 1/1 2", "1 2"); test_inv_inplace("3 -1 0 1/2 0 1", "2 0 1/3 -1 0 1"); test_inv_inplace("3 -1 0 -1/2 0 1", "2 0 -1/3 1 0 1"); test_is_zero("0", 1); test_is_zero("0/1 1", 1); test_is_zero("3 -1 0 1/2 0 1", 0); test_is_zero("3 -1 0 1/2 1 1", 0); test_is_one("0", 0); test_is_one("0/1 1", 0); test_is_one("1 1/1 1", 1); test_is_one("2 1 1/2 1 1", 1); test_is_one("3 -1 0 1/2 0 1", 0); test_equal("1 1/1 2", "1 1/1 2", 1); test_equal("1 1/1 2", "1 1/1 2", 1); test_equal("3 -1 0 1/2 1 1", "2 -1 1", 1); test_equal("3 -1 0 1/2 -1 1", "2 -1 1", 0); /* Addition and subtraction **********************************************/ test_add("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 1 0 1/4 0 1 0 1"); test_add("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 3 -2 1/2 -1 1"); test_add("0/2 1 1", "1 2/1 1", "1 2"); test_add("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_add("2 1 1/1 1", "2 -1 1/1 1", "2 0 2"); test_add("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 -1 2 2/3 0 -1 1"); test_add("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 7 12 7 1/3 2 3 1"); test_add("2 1 1/2 -1 1", "2 1 1", "3 0 1 1/2 -1 1"); test_add("1 1/2 1 1", "2 0 1/2 1 1", "1 1"); test_add("2 1 1/3 4 -4 1", "1 1/2 -2 1", "2 -1 2/3 4 -4 1"); test_add("3 0 1 1/3 1 2 1", "2 0 -1/2 1 1", "0"); test_add("2 1 1/2 0 1", "2 -1 1/2 0 1", "1 2"); test_add("1 1/3 3 5 2", "1 1/3 6 7 2", "1 1/3 2 3 1"); test_add_in_place1("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 1 0 1/4 0 1 0 1"); test_add_in_place1("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 3 -2 1/2 -1 1"); test_add_in_place1("0/2 1 1", "1 2/1 1", "1 2"); test_add_in_place1("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_add_in_place1("2 1 1/1 1", "2 -1 1/1 1", "2 0 2"); test_add_in_place1("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 -1 2 2/3 0 -1 1"); test_add_in_place1("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 7 12 7 1/3 2 3 1"); test_add_in_place1("2 1 1/2 -1 1", "2 1 1", "3 0 1 1/2 -1 1"); test_add_in_place1("1 1/2 1 1", "2 0 1/2 1 1", "1 1"); test_add_in_place1("2 1 1/3 4 -4 1", "1 1/2 -2 1", "2 -1 2/3 4 -4 1"); test_add_in_place1("3 0 1 1/3 1 2 1", "2 0 -1/2 1 1", "0"); test_add_in_place1("2 1 1/2 0 1", "2 -1 1/2 0 1", "1 2"); test_add_in_place2("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 1 0 1/4 0 1 0 1"); test_add_in_place2("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 3 -2 1/2 -1 1"); test_add_in_place2("0/2 1 1", "1 2/1 1", "1 2"); test_add_in_place2("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_add_in_place2("2 1 1/1 1", "2 -1 1/1 1", "2 0 2"); test_add_in_place2("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 -1 2 2/3 0 -1 1"); test_add_in_place2("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 7 12 7 1/3 2 3 1"); test_add_in_place2("2 1 1/2 -1 1", "2 1 1", "3 0 1 1/2 -1 1"); test_add_in_place2("1 1/2 1 1", "2 0 1/2 1 1", "1 1"); test_add_in_place2("2 1 1/3 4 -4 1", "1 1/2 -2 1", "2 -1 2/3 4 -4 1"); test_add_in_place2("3 0 1 1/3 1 2 1", "2 0 -1/2 1 1", "0"); test_add_in_place2("2 1 1/2 0 1", "2 -1 1/2 0 1", "1 2"); test_add_in_place3("2 1 1", "2 2 2"); test_add_in_place3("2 1 1/1 2", "2 1 1"); test_sub("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 3 0 1/4 0 1 0 1"); test_sub("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 -1 -2 1/2 -1 1"); test_sub("0/2 1 1", "1 2/1 1", "1 -2"); test_sub("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_sub("2 1 1/1 1", "2 -1 1/1 1", "1 2"); test_sub("2 1 1/2 0 1", "2 2 1/2 -1 1", "2 -1 -2/3 0 -1 1"); test_sub("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 -9 -12 -5 -1/3 2 3 1"); test_sub("2 -1 1/2 0 1", "1 1", "1 -1/2 0 1"); test_sub("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 3 0 1/4 0 1 0 1"); test_sub("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 -1 -2 1/2 -1 1"); test_sub("0/2 1 1", "1 2/1 1", "1 -2"); test_sub("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_sub("2 1 1/1 1", "2 -1 1/1 1", "1 2"); test_sub("2 1 1/2 0 1", "2 2 1/2 -1 1", "2 -1 -2/3 0 -1 1"); test_sub("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 -9 -12 -5 -1/3 2 3 1"); test_sub("2 1 1/2 -1 1", "2 1 1", "3 2 1 -1/2 -1 1"); test_sub("1 1/2 1 1", "2 0 1/2 1 1", "2 1 -1/2 1 1"); test_sub("2 1 1/3 4 -4 1", "1 1/2 -2 1", "1 3/3 4 -4 1"); test_sub("3 0 1 1/3 1 2 1", "2 0 -1/2 1 1", "2 0 2/2 1 1"); test_sub("2 1 1/2 0 1", "2 -1 1/2 0 1", "1 2/2 0 1"); test_sub("1 1/3 3 5 2", "1 1/3 6 7 2", "1 1/4 6 13 9 2"); test_sub("2 1 1/2 0 2", "2 1 1/2 0 2", "0"); test_sub("2 -1 2/2 0 1", "2 -1 1/2 0 1", "1 1"); test_sub_in_place1("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 3 0 1/4 0 1 0 1"); test_sub_in_place1("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 -1 -2 1/2 -1 1"); test_sub_in_place1("0/2 1 1", "1 2/1 1", "1 -2"); test_sub_in_place1("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_sub_in_place1("2 1 1/1 1", "2 -1 1/1 1", "1 2"); test_sub_in_place1("2 1 1/2 0 1", "2 2 1/2 -1 1", "2 -1 -2/3 0 -1 1"); test_sub_in_place1("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 -9 -12 -5 -1/3 2 3 1"); test_sub_in_place2("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "5 1 0 3 0 1/4 0 1 0 1"); test_sub_in_place2("3 -1 0 1/2 1 1", "1 2/2 -1 1", "3 -1 -2 1/2 -1 1"); test_sub_in_place2("0/2 1 1", "1 2/1 1", "1 -2"); test_sub_in_place2("1 -3/1 4", "0/3 1 0 1", "1 -3/1 4"); test_sub_in_place2("2 1 1/1 1", "2 -1 1/1 1", "1 2"); test_sub_in_place2("2 1 1/2 0 1", "2 2 1/2 -1 1", "2 -1 -2/3 0 -1 1"); test_sub_in_place2("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "4 -9 -12 -5 -1/3 2 3 1"); test_sub_in_place3("2 -1 1/2 2 1", "0"); test_addmul("1 1/2 0 2", "2 3 1/1 4", "3 1 0 1/4 -2 0 0 1", "5 -4 3 1 5 1/5 0 -8 0 0 4"); test_submul("1 1/2 0 2", "2 3 1/1 4", "3 1 0 1/4 -2 0 0 1", "5 -4 -3 -1 -1 -1/5 0 -8 0 0 4"); /* Scalar multiplication and devision ************************************/ flint_mpz_init_set_si(mpzzero, 0); flint_mpz_init_set_si(mpzone, 1); flint_mpz_init_set_si(mpztwo, 2); mpq_init(mpqzero); flint_mpq_set_si(mpqzero, 0, 1); mpq_init(mpqone); flint_mpq_set_si(mpqone, 1, 1); mpq_init(mpqtwo); flint_mpq_set_si(mpqtwo, 2, 1); mpq_init(mpqtwoinv); flint_mpq_set_si(mpqtwoinv, 1, 2); test_scalar_mul_si("0", 1, "0"); test_scalar_mul_si("0", 0, "0"); test_scalar_mul_si("1 2", 0, "0"); test_scalar_mul_si("1 1/1 2", -2, "1 -1"); test_scalar_mul_si("2 1 1/2 -2 3", 5, "2 5 5/2 -2 3"); test_scalar_mul_si("2 1 1/2 -2 2", 3, "2 3 3/2 -2 2"); test_scalar_mul_mpz("0", mpzone, "0"); test_scalar_mul_mpz("0", mpzzero, "0"); test_scalar_mul_mpz("1 2", mpzzero, "0"); test_scalar_mul_mpz("1 1/1 2", mpztwo, "1 1"); test_scalar_mul_mpq("0", mpqone, "0"); test_scalar_mul_mpq("0", mpqzero, "0"); test_scalar_mul_mpq("1 2", mpqzero, "0"); test_scalar_mul_mpq("1 1/1 2", mpqtwo, "1 1"); test_scalar_mul_mpq("1 -2/1 1", mpqtwoinv, "1 -1"); test_scalar_div_si("0", 1, "0"); test_scalar_div_si("1 2", 2, "1 1"); test_scalar_div_si("1 1/1 2", -2, "1 -1/1 4"); test_scalar_div_si("3 -5 0 3/2 1 1", 2, "3 -5 0 3/2 2 2"); test_scalar_div_si("3 2 8 4/2 0 1", 3, "3 2 8 4/2 0 3"); test_scalar_div_si("3 2 8 4/2 0 1", -3, "3 -2 -8 -4/2 0 3"); test_scalar_div_si("3 -27 0 9/2 0 1", -3, "3 9 0 -3/2 0 1"); test_scalar_div_mpz("0", mpzone, "0"); test_scalar_div_mpz("1 2", mpztwo, "1 1"); test_scalar_div_mpz("1 1/1 2", mpztwo, "1 1/1 4"); test_scalar_div_mpq("0", mpqone, "0"); test_scalar_div_mpq("1 2", mpqone, "1 2"); test_scalar_div_mpq("1 1/1 2", mpqtwo, "1 1/1 4"); test_scalar_div_mpq("1 -2/1 1", mpqtwoinv, "1 -4"); mpz_clear(mpzzero); mpz_clear(mpzone); mpz_clear(mpztwo); mpq_clear(mpqzero); mpq_clear(mpqone); mpq_clear(mpqtwo); mpq_clear(mpqtwoinv); /* Multiplication, division and powing *********************************/ test_mul("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "1 -1"); test_mul("3 -1 0 1/2 1 1", "1 2/2 -1 1", "1 2"); test_mul("0/2 1 1", "1 2/1 1", "0"); test_mul("1 -3/1 4", "0/3 1 0 1", "0"); test_mul("2 1 1/1 1", "2 -1 1/1 1", "3 -1 0 1"); test_mul("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 2 3 1/3 0 -1 1"); test_mul("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "3 -2 1 1/2 1 1"); test_mul_in_place1("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "1 -1"); test_mul_in_place1("3 -1 0 1/2 1 1", "1 2/2 -1 1", "1 2"); test_mul_in_place1("0/2 1 1", "1 2/1 1", "0"); test_mul_in_place1("1 -3/1 4", "0/3 1 0 1", "0"); test_mul_in_place1("2 1 1/1 1", "2 -1 1/1 1", "3 -1 0 1"); test_mul_in_place1("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 2 3 1/3 0 -1 1"); test_mul_in_place1("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "3 -2 1 1/2 1 1"); test_mul_in_place2("3 1 0 1/2 0 1", "2 0 -1/3 1 0 1", "1 -1"); test_mul_in_place2("3 -1 0 1/2 1 1", "1 2/2 -1 1", "1 2"); test_mul_in_place2("0/2 1 1", "1 2/1 1", "0"); test_mul_in_place2("1 -3/1 4", "0/3 1 0 1", "0"); test_mul_in_place2("2 1 1/1 1", "2 -1 1/1 1", "3 -1 0 1"); test_mul_in_place2("2 1 1/2 0 1", "2 2 1/2 -1 1", "3 2 3 1/3 0 -1 1"); test_mul_in_place2("2 -1 1/2 2 1", "3 4 4 1/2 1 1", "3 -2 1 1/2 1 1"); test_mul_in_place3("2 0 1/2 1 1", "3 0 0 1/3 1 2 1"); test_div("3 -1 0 1/1 2", "2 1 1/1 1", "2 -1 1/1 2"); test_div("0/2 1 1", "2 1 1/1 1", "0"); test_div("3 -1 0 1/1 4", "2 -1 -1/1 2", "2 1 -1/1 2"); test_div("2 1 1", "2 1 -1/2 1 -1", "2 1 1"); test_div("2 1 1/3 4 4 1", "2 -1 1/3 6 5 1", "3 3 4 1/3 -2 1 1"); test_div_in_place1("3 -1 0 1/1 2", "2 1 1/1 1", "2 -1 1/1 2"); test_div_in_place1("0/2 1 1", "2 1 1/1 1", "0"); test_div_in_place1("3 -1 0 1/1 4", "2 -1 -1/1 2", "2 1 -1/1 2"); test_div_in_place1("2 1 1", "2 1 -1/2 1 -1", "2 1 1"); test_div_in_place1("2 1 1/3 4 4 1", "2 -1 1/3 6 5 1", "3 3 4 1/3 -2 1 1"); test_div_in_place1("0", "1 2/2 3 5", "0"); test_div_in_place2("3 -1 0 1/1 2", "2 1 1/1 1", "2 -1 1/1 2"); test_div_in_place2("0/2 1 1", "2 1 1/1 1", "0"); test_div_in_place2("3 -1 0 1/1 4", "2 -1 -1/1 2", "2 1 -1/1 2"); test_div_in_place2("2 1 1", "2 1 -1/2 1 -1", "2 1 1"); test_div_in_place2("2 1 1/3 4 4 1", "2 -1 1/3 6 5 1", "3 3 4 1/3 -2 1 1"); test_div_in_place3("3 -1 0 1/1 2", "1 1"); test_pow("2 0 -1/1 2", 3, "4 0 0 0 -1/1 8"); test_pow("0", 0, "1 1"); test_pow("2 1 -1", 0, "1 1"); test_pow("2 1 1/2 0 1", 0, "1 1"); /* Derivative ************************************************************/ test_derivative("0", "0"); test_derivative("1 2", "0"); test_derivative("1 -1/1 2", "0"); test_derivative("2 0 1", "1 1"); test_derivative("3 1 0 1", "2 0 2"); test_derivative("1 1/2 0 1", "1 -1/3 0 0 1"); test_derivative("2 2 1/2 -1 1", "1 -3/3 1 -2 1"); test_derivative("2 0 1/3 1 2 1", "2 1 -1/4 1 3 3 1"); /* Bug which allowed constant factors */ test_derivative("3 5 1 -2/2 10 2", "3 0 -10 -1/3 25 10 1"); /* Evaluation ************************************************************/ test_evaluate("1 1/1 2", -2, 3, "1/2"); test_evaluate("3 1 0 1/2 0 1", -1, 2, "-5/2"); test_evaluate("2 3 1/2 -1 1", 1, 1, "P"); test_evaluate("2 3 1/2 -1 1", 2, 3, "-11"); test_evaluate("2 3 1/2 -1 2", 1, 2, "P"); test_evaluate("2 1 1/2 -1 1", 2, 1, "3"); /* String methods ********************************************************/ fmpz_poly_q_init(qpoly1); ans = fmpz_poly_q_set_str(qpoly1, "1 3/xyz"); if ((ans == 0) || !fmpz_poly_q_is_zero(qpoly1)) { flint_printf("test_set_str: failed\n"); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_q_init(qpoly1); ans = fmpz_poly_q_set_str(qpoly1, "abc/1 3"); if ((ans == 0) || !fmpz_poly_q_is_zero(qpoly1)) { flint_printf("test_set_str: failed\n"); abort(); } fmpz_poly_q_clear(qpoly1); fmpz_poly_q_init(qpoly1); ans = fmpz_poly_q_set_str(qpoly1, "abc/xyz"); if ((ans == 0) || !fmpz_poly_q_is_zero(qpoly1)) { flint_printf("test_set_str: failed\n"); abort(); } fmpz_poly_q_clear(qpoly1); test_get_str_pretty("1 -3", "-3"); test_get_str_pretty("3 1 2 1", "t^2+2*t+1"); test_get_str_pretty("1 -2/2 1 1", "-2/(t+1)"); test_get_str_pretty("2 1 1/2 -1 1", "(t+1)/(t-1)"); test_get_str_pretty("2 1 1/1 2", "(t+1)/2"); test_get_str_pretty("1 1/1 2", "1/2"); FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int is_aks_prime(mpz_t n) { mpz_t *px, *py; int retval; UV i, s, r, a; UV starta = 1; int _verbose = get_verbose_level(); if (mpz_cmp_ui(n, 4) < 0) return (mpz_cmp_ui(n, 1) <= 0) ? 0 : 1; /* Just for performance: check small divisors: 2*3*5*7*11*13*17*19*23 */ if (mpz_gcd_ui(0, n, 223092870UL) != 1 && mpz_cmp_ui(n, 23) > 0) return 0; if (mpz_perfect_power_p(n)) return 0; #if AKS_VARIANT == AKS_VARIANT_V6 /* From the V6 AKS paper */ { mpz_t sqrtn, t; double log2n; UV limit, startr; PRIME_ITERATOR(iter); mpz_init(sqrtn); mpz_sqrt(sqrtn, n); log2n = mpz_log2(n); limit = (UV) floor( log2n * log2n ); if (_verbose>1) gmp_printf("# AKS checking order_r(%Zd) to %"UVuf"\n", n, (unsigned long) limit); /* Using a native r limits us to ~2000 digits in the worst case (r ~ log^5n) * but would typically work for 100,000+ digits (r ~ log^3n). This code is * far too slow to matter either way. Composite r is ok here, but it will * always end up prime, so save time and just check primes. */ retval = 0; /* Start order search at a good spot. Idea from Nemana and Venkaiah. */ startr = (mpz_sizeinbase(n,2)-1) * (mpz_sizeinbase(n,2)-1); startr = (startr < 1002) ? 2 : startr - 100; for (r = 2; /* */; r = prime_iterator_next(&iter)) { if (mpz_divisible_ui_p(n, r) ) /* r divides n. composite. */ { retval = 0; break; } if (mpz_cmp_ui(sqrtn, r) <= 0) /* no r <= sqrtn divides n. prime. */ { retval = 1; break; } if (r < startr) continue; if (mpz_order_ui(r, n, limit) > limit) { retval = 2; break; } } prime_iterator_destroy(&iter); mpz_clear(sqrtn); if (retval != 2) return retval; /* Since r is prime, phi(r) = r-1. */ s = (UV) floor( sqrt(r-1) * log2n ); } #elif AKS_VARIANT == AKS_VARIANT_BORNEMANN /* Bernstein + Voloch */ { UV slim; double c2, x; /* small t = few iters of big poly. big t = many iters of small poly */ double const t = (mpz_sizeinbase(n, 2) <= 64) ? 32 : 40; double const t1 = (1.0/((t+1)*log(t+1)-t*log(t))); double const dlogn = mpz_logn(n); mpz_t tmp; PRIME_ITERATOR(iter); mpz_init(tmp); prime_iterator_setprime(&iter, (UV) (t1*t1 * dlogn*dlogn) ); r = prime_iterator_next(&iter); while (!is_primitive_root_uiprime(n,r)) r = prime_iterator_next(&iter); prime_iterator_destroy(&iter); slim = (UV) (2*t*(r-1)); c2 = dlogn * floor(sqrt(r)); { /* Binary search for first s in [1,slim] where x >= 0 */ UV bi = 1; UV bj = slim; while (bi < bj) { s = bi + (bj-bi)/2; mpz_bin_uiui(tmp, r+s-1, s); x = mpz_logn(tmp) / c2 - 1.0; if (x < 0) bi = s+1; else bj = s; } s = bi-1; } s = (s+3) >> 1; /* Bornemann checks factors up to (s-1)^2, we check to max(r,s) */ /* slim = (s-1)*(s-1); */ slim = (r > s) ? r : s; if (_verbose > 1) printf("# aks trial to %"UVuf"\n", slim); if (_GMP_trial_factor(n, 2, slim) > 1) { mpz_clear(tmp); return 0; } mpz_sqrt(tmp, n); if (mpz_cmp_ui(tmp, slim) <= 0) { mpz_clear(tmp); return 1; } mpz_clear(tmp); } #elif AKS_VARIANT == AKS_VARIANT_BERN21 { /* Bernstein 2003, theorem 2.1 (simplified) */ UV q; double slim, scmp, x; mpz_t t, t2; PRIME_ITERATOR(iter); mpz_init(t); mpz_init(t2); r = s = 0; while (1) { /* todo: Check r|n and r >= sqrt(n) here instead of waiting */ if (mpz_cmp_ui(n, r) <= 0) break; r = prime_iterator_next(&iter); q = largest_factor(r-1); mpz_set_ui(t, r); mpz_powm_ui(t, n, (r-1)/q, t); if (mpz_cmp_ui(t, 1) <= 0) continue; scmp = 2 * floor(sqrt(r)) * mpz_log2(n); slim = 20 * (r-1); /* Check viability */ mpz_bin_uiui(t, q+slim-1, slim); if (mpz_log2(t) < scmp) continue; for (s = 2; s < slim; s++) { mpz_bin_uiui(t, q+s-1, s); if (mpz_log2(t) > scmp) break; } if (s < slim) break; } mpz_clear(t); mpz_clear(t2); prime_iterator_destroy(&iter); if (_GMP_trial_factor(n, 2, s) > 1) return 0; } #elif AKS_VARIANT == AKS_VARIANT_BERN22 { /* Bernstein 2003, theorem 2.2 (simplified) */ UV q; double slim, scmp, x; mpz_t t, t2; PRIME_ITERATOR(iter); mpz_init(t); mpz_init(t2); r = s = 0; while (1) { /* todo: Check r|n and r >= sqrt(n) here instead of waiting */ if (mpz_cmp_ui(n, r) <= 0) break; r = prime_iterator_next(&iter); if (!is_primitive_root_uiprime(n,r)) continue; q = r-1; /* Since r is prime, phi(r) = r-1 */ scmp = 2 * floor(sqrt(r-1)) * mpz_log2(n); slim = 20 * (r-1); /* Check viability */ mpz_bin_uiui(t, q+slim-1, slim); if (mpz_log2(t) < scmp) continue; for (s = 2; s < slim; s++) { mpz_bin_uiui(t, q+s-1, s); if (mpz_log2(t) > scmp) break; } if (s < slim) break; } mpz_clear(t); mpz_clear(t2); prime_iterator_destroy(&iter); if (_GMP_trial_factor(n, 2, s) > 1) return 0; } #elif AKS_VARIANT == AKS_VARIANT_BERN23 { /* Bernstein 2003, theorem 2.3 (simplified) */ UV q, d, limit; double slim, scmp, sbin, x, log2n; mpz_t t, t2; PRIME_ITERATOR(iter); mpz_init(t); mpz_init(t2); log2n = mpz_log2(n); limit = (UV) floor( log2n * log2n ); r = 2; s = 0; while (1) { /* todo: Check r|n and r >= sqrt(n) here instead of waiting */ if (mpz_cmp_ui(n, r) <= 0) break; r++; UV gcd = mpz_gcd_ui(NULL, n, r); if (gcd != 1) { mpz_clear(t); mpz_clear(t2); return 0; } UV v = mpz_order_ui(r, n, limit); if (v >= limit) continue; mpz_set_ui(t2, r); totient(t, t2); q = mpz_get_ui(t); UV phiv = q/v; /* printf("phi(%lu)/v = %lu/%lu = %lu\n", r, q, v, phiv); */ /* This is extremely inefficient. */ /* Choose an s value we'd be happy with */ slim = 20 * (r-1); /* Quick check to see if it could work with s=slim, d=1 */ mpz_bin_uiui(t, q+slim-1, slim); sbin = mpz_log2(t); if (sbin < 2*floor(sqrt(q))*log2n) continue; for (s = 2; s < slim; s++) { mpz_bin_uiui(t, q+s-1, s); sbin = mpz_log2(t); if (sbin < 2*floor(sqrt(q))*log2n) continue; /* d=1 */ /* Check each number dividing phi(r)/v */ for (d = 2; d < phiv; d++) { if ((phiv % d) != 0) continue; scmp = 2 * d * floor(sqrt(q/d)) * log2n; if (sbin < scmp) break; } /* if we did not exit early, this s worked for each d. This s wins. */ if (d >= phiv) break; } if (s < slim) break; } mpz_clear(t); mpz_clear(t2); prime_iterator_destroy(&iter); if (_GMP_trial_factor(n, 2, s) > 1) return 0; } #elif AKS_VARIANT == AKS_VARIANT_BERN41 { double const log2n = mpz_log2(n); /* Tuning: Initial 'r' selection */ double const r0 = 0.008 * log2n * log2n; /* Tuning: Try a larger 'r' if 's' looks very large */ UV const rmult = 8; UV slim; mpz_t tmp, tmp2; PRIME_ITERATOR(iter); mpz_init(tmp); mpz_init(tmp2); /* r has to be at least 3. */ prime_iterator_setprime(&iter, (r0 < 2) ? 2 : (UV) r0); r = prime_iterator_next(&iter); /* r must be a primitive root. For performance, skip if s looks too big. */ while ( !is_primitive_root_uiprime(n, r) || !bern41_acceptable(n, r, rmult*(r-1), tmp, tmp2) ) r = prime_iterator_next(&iter); prime_iterator_destroy(&iter); { /* Binary search for first s in [1,lim] where conditions met */ UV bi = 1; UV bj = rmult * (r-1); while (bi < bj) { s = bi + (bj-bi)/2; if (!bern41_acceptable(n,r,s,tmp,tmp2)) bi = s+1; else bj = s; } s = bj; /* Our S goes from 2 to s+1. */ starta = 2; s = s+1; } /* printf("chose r=%lu s=%lu d = %lu i = %lu j = %lu\n", r, s, d, i, j); */ /* Check divisibility to s(s-1) to cover both gcd conditions */ slim = s * (s-1); if (_verbose > 1) printf("# aks trial to %"UVuf"\n", slim); if (_GMP_trial_factor(n, 2, slim) > 1) { mpz_clear(tmp); mpz_clear(tmp2); return 0; } /* If we checked divisibility to sqrt(n), then it is prime. */ mpz_sqrt(tmp, n); if (mpz_cmp_ui(tmp, slim) <= 0) { mpz_clear(tmp); mpz_clear(tmp2); return 1; } /* Check b^(n-1) = 1 mod n for b in [2..s] */ if (_verbose > 1) printf("# aks checking fermat to %"UVuf"\n", s); mpz_sub_ui(tmp2, n, 1); for (i = 2; i <= s; i++) { mpz_set_ui(tmp, i); mpz_powm(tmp, tmp, tmp2, n); if (mpz_cmp_ui(tmp, 1) != 0) { mpz_clear(tmp); mpz_clear(tmp2); return 0; } } mpz_clear(tmp); mpz_clear(tmp2); } #endif if (_verbose) gmp_printf("# AKS %Zd. r = %"UVuf" s = %"UVuf"\n", n, (unsigned long) r, (unsigned long) s); /* Create the three polynomials we will use */ New(0, px, r, mpz_t); New(0, py, r, mpz_t); if ( !px || !py ) croak("allocation failure\n"); for (i = 0; i < r; i++) { mpz_init(px[i]); mpz_init(py[i]); } retval = 1; for (a = starta; a <= s; a++) { retval = test_anr(a, n, r, px, py); if (!retval) break; if (_verbose>1) { printf("."); fflush(stdout); } } if (_verbose>1) { printf("\n"); fflush(stdout); }; /* Free the polynomials */ for (i = 0; i < r; i++) { mpz_clear(px[i]); mpz_clear(py[i]); } Safefree(px); Safefree(py); return retval; }
BigInt::~BigInt() { mpz_clear(val); }
int tfel_decrypt_cp(char *inputfile, char *keyfile, char *output) { int i; FILE *fp; //pubkey input //共通 tfel_pubkey *pubkey = NULL; pubkey = (tfel_pubkey*)malloc(sizeof(tfel_pubkey)); if (pubkey == NULL) return -1; tfel_param_G *param_G; param_G = (tfel_param_G*)malloc(sizeof(tfel_param_G)); if (param_G == NULL) { tfel_clear_pk(pubkey->num_att, pubkey); free(pubkey); return -1; } memset(param_G, 0, sizeof(tfel_param_G)); pairing_init(param_G->p, CURVE); importpub(pubkey, *param_G); //pubkey input //sk_Gamma input //CP secretkey sk_Gamma; sk_Gamma.sk_Delta = (attribute_set*)malloc(sizeof(attribute_set)); sk_Gamma.sk_AS = NULL; sk_Gamma.sk_kStar = (basis*)malloc(sizeof(basis)); import_sk(sk_Gamma.sk_Delta, sk_Gamma.sk_kStar, *param_G, keyfile); //sk_Gamma input //ciphertext input //共通 char *input_buf = NULL;//,*keyfile_buf = NULL; char *aes_blob64 = NULL, *abe_blob64 = NULL, *iv_blob64 = NULL; ssize_t input_len; size_t key_len; fp = fopen(inputfile, "r"); if(fp != NULL) { if((input_len = read_file(fp, &input_buf)) > 0) { tokenize_inputfile(input_buf, &abe_blob64, &aes_blob64, &iv_blob64); if(aes_blob64 == NULL || abe_blob64 == NULL || iv_blob64 == NULL) { fprintf(stderr, "Input file either not well-formed or not encrypted.\n"); fclose(fp); return -1; } free(input_buf); } } else { fprintf(stderr, "Could not load input file: %s\n", inputfile); return FALSE; } fclose(fp); //ciphertext input //decode ciphertext //共通 tfel_ciphertext ct; memset(&ct, 0, sizeof(tfel_ciphertext)); size_t abeLength; unsigned char *data = NewBase64Decode((const char *) abe_blob64, strlen(abe_blob64), &abeLength); ct.data = data; ct.data_len = abeLength; ct.max_len = abeLength; //decode ciphertext //deserialize ciphertext /*printf("abe_blob64 = %zd\n", strlen(abe_blob64)); printf("abeLength = %zd\n", abeLength); printf("ct.data = %s\n", ct.data); printf("ct.data_len = %zd\n", ct.data_len); printf("ct.max_len = %zd\n", ct.max_len);*/ basis *c_i = NULL; c_i = (basis*)malloc(sizeof(basis)); if (c_i == NULL){ //error処理 } AccessStructure *AS = NULL; AS = (AccessStructure*)malloc(sizeof(AccessStructure)); tfel_deserialize_ciphertext_cp(AS, c_i, ct.data, ct.max_len, param_G->p); //deserialize ciphertext //decode iv size_t ivLength; char *ivec = NewBase64Decode((const char *) iv_blob64, strlen(iv_blob64), &ivLength); //debug("IV: "); //print_buffer_as_hex((uint8 *) ivec, AES_BLOCK_SIZE); //decode iv //decode aes /* decode the aesblob64 */ size_t aesLength; char *aesblob = NewBase64Decode((const char *) aes_blob64, strlen(aes_blob64), &aesLength); //printf("sizeof(aesblob) = %zd\n", aesLength); //decode aes //拡大係数行列のチェック printf("check\n"); AccessStructure *aAS; aAS = check_attribute_to_matrix(sk_Gamma.sk_Delta, AS); //errorならNULLを返す //alpha_iを生成 mpz_t order; mpz_init(order); mpz_set(order, *pairing_get_order(param_G->p)); mpz_t *alpha_i; mpz_t temp; mpz_init(temp); Element *K; Element *temp_E; Element temp_0; element_init(temp_0, param_G->p->g3); alpha_i = calc_alpha_i(aAS, order); rho_i *r_ptr; r_ptr = aAS->rho; int t; //search_tで使用 for (i = 0; i < aAS->num_policy+1; i++) { //generate K if (i == 0) { K = pairing_c_k(param_G->p, NULL, c_i->M[0], sk_Gamma.sk_kStar->M[0], NULL); } else { t = search_t(r_ptr, sk_Gamma.sk_Delta); //r_ptrからtを持ってくる関数 temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[i], sk_Gamma.sk_kStar->M[t], &alpha_i[i-1]); //temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[t], sk_Gamma.sk_kStar->M[i], &alpha_i[i-1]); element_mul(temp_0, *temp_E, *K); element_set(*K, temp_0); element_clear(*temp_E); free(temp_E); r_ptr = r_ptr->next; } } //printf("K generate\n"); //Kのバイト列を16ビットのハッシュに key_len = element_get_oct_length(*K); // size of K unsigned char *K_oct; K_oct = (unsigned char*)malloc(sizeof(unsigned char)*key_len); element_to_oct(K_oct, &key_len, *K); // bytes of K unsigned char *session_key; session_key = (unsigned char *)malloc(sizeof(unsigned char)*16); //int d_len; hash_to_bytes(K_oct, key_len, SESSION_KEY_LEN, session_key, 2); //Kのバイト列を16ビットのハッシュに //復号 AES_KEY sk; //char aes_result[aesLength+1]; char *aes_result; aes_result = (char*)malloc(sizeof(char)*aesLength+1); AES_set_decrypt_key((uint8 *) session_key, 8*SESSION_KEY_LEN, &sk); memset(aes_result, 0, aesLength+1); AES_cbc_encrypt((uint8 *) aesblob, (uint8 *) aes_result, aesLength, &sk, (uint8 *) ivec, AES_DECRYPT); char magic[strlen(MAGIC)+1]; memset(magic, 0, strlen(MAGIC)+1); strncpy(magic, aes_result, strlen(MAGIC)); if(strcmp(magic, MAGIC) == 0) { //printf("Recovered magic: '%s'\n", magic); //printf("Plaintext: %s\n", (char *) (aes_result + strlen(MAGIC))); if ((fp = fopen(output, "w")) == NULL) { fprintf(stderr, "output open error\n"); } else { fprintf(fp, "%s\n", (char*)(aes_result + strlen(MAGIC))); fclose(fp); } //magic_failed = FALSE; } else { printf("error decryption\n"); //printf(stderr, "ERROR: ABE decryption unsuccessful!!\n"); //magic_failed = TRUE; } //復号 free(aesblob); free(aes_blob64); free(ivec); free(iv_blob64); free(data); free(abe_blob64); free(aes_result); //free(&input_buf); free(session_key); free(K_oct); element_clear(*K); free(K); if (aAS != NULL) { for (i = 0; i < aAS->S->row; i++) { mpz_clear(alpha_i[i]); } free(alpha_i); AccessStructure_clear(aAS);//error } element_clear(temp_0); mpz_clear(order); mpz_clear(temp); for (i = 0; i < c_i->dim; i++) { //memsetとか追加? free(c_i->M[i]); } free(c_i->M); free(c_i); Spanprogram_clear(AS->S); free(AS); //AccessStructure_clear(AS);//すでにAS->rhoがAccessStructure_clear(aAS)により解放されているため return 0; }
static int ORBITS_ (const int entry) { /* Local variables */ #include "orbits.c.l.h" static int initialized = 0; static cob_field *cob_user_parameters[COB_MAX_FIELD_PARAMS]; static struct cob_module module = { NULL, NULL, NULL, NULL, cob_user_parameters, 0, '.', '$', ',', 1, 1, 1, 0 }; /* Start of function code */ /* CANCEL callback handling */ if (unlikely(entry < 0)) { if (!initialized) { return 0; } cob_close (h_ENTRADA, 0, NULL); cob_close (h_SORTIDA, 0, NULL); mpz_clear (d0.value); d0.scale = 0; mpz_clear (d1.value); d1.scale = 0; mpz_clear (d2.value); d2.scale = 0; mpz_clear (d3.value); d3.scale = 0; mpz_clear (d4.value); d4.scale = 0; initialized = 0; return 0; } /* Initialize frame stack */ frame_ptr = &frame_stack[0]; frame_ptr->perform_through = 0; /* Push module stack */ module.next = cob_current_module; cob_current_module = &module; /* Initialize program */ if (unlikely(initialized == 0)) { if (!cob_initialized) { cob_fatal_error (COB_FERROR_INITIALIZED); } cob_check_version (COB_SOURCE_FILE, COB_PACKAGE_VERSION, COB_PATCH_LEVEL); /* Initialize decimal numbers */ cob_decimal_init (&d0); cob_decimal_init (&d1); cob_decimal_init (&d2); cob_decimal_init (&d3); cob_decimal_init (&d4); (*(int *) (b_1)) = 0; if (!h_ENTRADA) { h_ENTRADA = cob_malloc (sizeof(cob_file)); } h_ENTRADA->select_name = (const char *)"ENTRADA"; h_ENTRADA->file_status = h_ENTRADA_status; memset (h_ENTRADA_status, '0', 2); h_ENTRADA->assign = &c_1; h_ENTRADA->record = &f_14; h_ENTRADA->record_size = NULL; h_ENTRADA->record_min = 0; h_ENTRADA->record_max = 33; h_ENTRADA->nkeys = 0; h_ENTRADA->keys = NULL; h_ENTRADA->file = NULL; h_ENTRADA->organization = 1; h_ENTRADA->access_mode = 1; h_ENTRADA->lock_mode = 0; h_ENTRADA->open_mode = 0; h_ENTRADA->flag_optional = 0; h_ENTRADA->last_open_mode = 0; h_ENTRADA->special = 0; h_ENTRADA->flag_nonexistent = 0; h_ENTRADA->flag_end_of_file = 0; h_ENTRADA->flag_begin_of_file = 0; h_ENTRADA->flag_first_read = 0; h_ENTRADA->flag_read_done = 0; h_ENTRADA->flag_select_features = 0; h_ENTRADA->flag_needs_nl = 0; h_ENTRADA->flag_needs_top = 0; h_ENTRADA->file_version = 0; if (!h_SORTIDA) { h_SORTIDA = cob_malloc (sizeof(cob_file)); } h_SORTIDA->select_name = (const char *)"SORTIDA"; h_SORTIDA->file_status = h_SORTIDA_status; memset (h_SORTIDA_status, '0', 2); h_SORTIDA->assign = &c_2; h_SORTIDA->record = &f_16; h_SORTIDA->record_size = NULL; h_SORTIDA->record_min = 0; h_SORTIDA->record_max = 80; h_SORTIDA->nkeys = 0; h_SORTIDA->keys = NULL; h_SORTIDA->file = NULL; h_SORTIDA->organization = 1; h_SORTIDA->access_mode = 1; h_SORTIDA->lock_mode = 0; h_SORTIDA->open_mode = 0; h_SORTIDA->flag_optional = 0; h_SORTIDA->last_open_mode = 0; h_SORTIDA->special = 0; h_SORTIDA->flag_nonexistent = 0; h_SORTIDA->flag_end_of_file = 0; h_SORTIDA->flag_begin_of_file = 0; h_SORTIDA->flag_first_read = 0; h_SORTIDA->flag_read_done = 0; h_SORTIDA->flag_select_features = 0; h_SORTIDA->flag_needs_nl = 0; h_SORTIDA->flag_needs_top = 0; h_SORTIDA->file_version = 0; initialized = 1; } /* Allocate LOCAL storage */ b_17 = cob_malloc (24); b_21 = cob_malloc (24); b_25 = cob_malloc (24); b_29 = cob_malloc (24); b_33 = cob_malloc (24); b_37 = cob_malloc (24); b_41 = cob_malloc (24); b_45 = cob_malloc (8); b_46 = cob_malloc (4); b_47 = cob_malloc (8); b_48 = cob_malloc (8); b_49 = cob_malloc (8); b_50 = cob_malloc (8); b_51 = cob_malloc (8); b_52 = cob_malloc (4); b_53 = cob_malloc (1); b_55 = cob_malloc (56); b_61 = cob_malloc (56); b_67 = cob_malloc (56); /* Initialialize LOCAL storage */ {double temp = 0.0; memcpy (b_17, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_17 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_17 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_21, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_21 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_21 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_25, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_25 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_25 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_29, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_29 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_29 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_33, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_33 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_33 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_37, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_37 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_37 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_41, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_41 + 8, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_41 + 16, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_45, (char *)&temp, sizeof(temp));} memset (b_46, 0, 4); {double temp = 0.0; memcpy (b_47, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_48, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_49, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_50, (char *)&temp, sizeof(temp));} {double temp = 0.0; memcpy (b_51, (char *)&temp, sizeof(temp));} memset (b_52, 0, 4); *(unsigned char *)(b_53) = 32; memcpy (b_55, "X", 1); memset (b_55 + 1, 32, 17); *(unsigned char *)(b_55 + 18) = 32; memcpy (b_55 + 19, "Y", 1); memset (b_55 + 19 + 1, 32, 17); *(unsigned char *)(b_55 + 37) = 32; memcpy (b_55 + 38, "Z", 1); memset (b_55 + 38 + 1, 32, 17); memset (b_61, 61, 18); *(unsigned char *)(b_61 + 18) = 32; memset (b_61 + 19, 61, 18); *(unsigned char *)(b_61 + 37) = 32; memset (b_61 + 38, 61, 18); memset (b_67, 48, 18); *(unsigned char *)(b_67 + 18) = 32; memset (b_67 + 19, 48, 18); *(unsigned char *)(b_67 + 37) = 32; memset (b_67 + 38, 48, 18); cob_save_call_params = cob_call_params; /* Entry dispatch */ goto l_2; /* PROCEDURE DIVISION */ /* Entry ORBITS */ l_2:; /* MAIN SECTION */ /* BEGIN */ /* orbits.cob:97: DISPLAY */ { cob_display (0, 1, 1, &c_3); } /* orbits.cob:98: MOVE */ { cob_move (&c_4, (f_45.data = b_45, &f_45)); } /* orbits.cob:99: OPEN */ { cob_exception_code = 0; { cob_open (h_ENTRADA, 1, 0, NULL); } if (unlikely(cob_exception_code != 0)) { /* PERFORM Default Error Handler */ frame_ptr++; frame_ptr->perform_through = 1; frame_ptr->return_address = &&l_14; goto l_1; l_14: frame_ptr--; } }
int sm2_sign ( sm2_prvkey *prvkey, unsigned char *id, unsigned int ilen, unsigned char *message, unsigned int mlen, unsigned char *signature, unsigned int *slen ) { #ifndef MUL_BITS unsigned char xt[FIELD_SIZE_IN_BYTES*2]; #else unsigned char xt[32*2]; #endif mpz_t e, k, s; point_affn_t kG; //unsigned int xlen = sizeof(xt); if( !signature ) { *slen = FIELD_SIZE_IN_BYTES*2; return 0; } if(*slen < (unsigned int)(FIELD_SIZE_IN_BYTES*2)) return 1; sm2_z(id, ilen, GENERATOR, prvkey->sG, xt); // dump_mem(z, sizeof(z), "z"); sm2_hash(xt, SM3_HASH_LEN, message, mlen, NULL, 0, xt); // dump_mem(h, sizeof(h), "h"); mpz_init(e); OS2IP(e, xt, SM3_HASH_LEN); //e NN_BarrettSetBuf(&pXbufSubgrpOrder); mpz_mod(e, e, SUBGRP_ORDER); mpz_init(k); random_limit(k, SUBGRP_ORDER); NN_BarrettSetBuf(&pXbufFieldPrime); #ifdef USE_ECC_256 //mpz_set_str(k, "6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F", 16); #else //mpz_set_str(k, "ADB6F4FE3E8B1D9E0DA8C0D40FC962195DFAE76F5656460", 16); #endif point_affn_init(kG); point_affn_mul(kG, GENERATOR, k); // dump_point(kG, "kG"); // gmp_printf("x: %Zx\n", x); mpz_BarrettSetBuf(&pXbufSubgrpOrder); //mpz_mod_BarrettInit(SUBGRP_ORDER, &pXbuf); zp_add_mod_p(e, e, kG->x, SUBGRP_ORDER); I2OSP(signature, FIELD_SIZE_IN_BYTES, e); point_affn_clear(kG); mpz_init(s); mpz_add_ui(s, prvkey->s, 1); //1+d_A mpz_invert(s, s, SUBGRP_ORDER); //(1+d_A)^-1 zp_mul_mod_p(e, e, prvkey->s, SUBGRP_ORDER); zp_sub_mod_p(k, k, e, SUBGRP_ORDER); zp_mul_mod_p(s, s, k, SUBGRP_ORDER); //mpz_mod_BarrettInit(FIELD_P, &pXbuf); mpz_BarrettSetBuf(&pXbufFieldPrime); I2OSP(signature+FIELD_SIZE_IN_BYTES, FIELD_SIZE_IN_BYTES, s); *slen = FIELD_SIZE_IN_BYTES*2; mpz_clear(e); mpz_clear(k); mpz_clear(s); return 0; }
int sm2_verify ( sm2_pubkey *pubkey, unsigned char *id, unsigned int ilen, unsigned char *message, unsigned int mlen, unsigned char *signature, unsigned int slen ) { #ifndef MUL_BITS char xt[FIELD_SIZE_IN_BYTES>SM3_HASH_LEN?FIELD_SIZE_IN_BYTES:SM3_HASH_LEN]; #else char xt[SM3_HASH_LEN]; #endif mpz_t e, t, s, r; point_affn_t sG, tP; unsigned int xlen = sizeof(xt); (void)xlen; int ret; if(slen < (unsigned int)(FIELD_SIZE_IN_BYTES*2) ) return 1; sm2_z(id, ilen, GENERATOR, pubkey->sG, (unsigned char*)xt); sm2_hash((unsigned char*)xt, SM3_HASH_LEN, message, mlen, NULL, 0, (unsigned char*)xt); mpz_init(e); OS2IP(e, (unsigned char*)xt, SM3_HASH_LEN); //e mpz_BarrettSetBuf(&pXbufSubgrpOrder); mpz_mod(e, e, SUBGRP_ORDER); // gmp_printf("e: %Zx\n", e); mpz_init(r); OS2IP(r, signature, FIELD_SIZE_IN_BYTES); mpz_init(s); OS2IP(s, signature+FIELD_SIZE_IN_BYTES, FIELD_SIZE_IN_BYTES); mpz_init(t); //mpz_mod_BarrettInit(SUBGRP_ORDER, &pXbuf); zp_add_mod_p(t, r, s, SUBGRP_ORDER); //mpz_mod_BarrettInit(FIELD_P, &pXbuf); mpz_BarrettSetBuf(&pXbufFieldPrime); point_affn_init(sG); point_affn_mul(sG, GENERATOR, s); // dump_point(sG, "sG"); point_affn_init(tP); point_affn_mul(tP, pubkey->sG, t); // dump_point(tP, "tP"); point_affn_add(sG, sG, tP); // dump_point(sG, "sG"); point_affn_clear(tP); zp_add_mod_p(t, e, sG->x, SUBGRP_ORDER); ret = mpz_cmp(t, r); if( ret ) ret = 1; mpz_clear(e); mpz_clear(t); mpz_clear(s); mpz_clear(r); point_affn_clear(sG); //mpz_mod_BarrettInit(FIELD_P, &pXbuf); mpz_BarrettSetBuf(&pXbufFieldPrime); return ret; }
static void test_modulo (gmp_randstate_t rands, const struct ecc_modulo *m) { mpz_t u; mpz_t v; mpz_t p; mpz_t r; mpz_t t; unsigned z, i; mp_limb_t *up; mp_limb_t *vp; mp_limb_t *rp; mp_limb_t *scratch; mpz_init (u); mpz_init (v); mpz_init (t); mpz_roinit_n (p, m->m, m->size); up = xalloc_limbs (m->size); vp = xalloc_limbs (m->size); rp = xalloc_limbs (2*m->size); scratch = xalloc_limbs (m->sqrt_itch); /* Find a non-square */ for (z = 2; mpz_ui_kronecker (z, p) != -1; z++) ; if (verbose) fprintf(stderr, "Non square: %d\n", z); for (i = 0; i < COUNT; i++) { if (i & 1) { mpz_rrandomb (u, rands, m->bit_size); mpz_rrandomb (v, rands, m->bit_size); } else { mpz_urandomb (u, rands, m->bit_size); mpz_urandomb (v, rands, m->bit_size); } mpz_limbs_copy (up, u, m->size); mpz_limbs_copy (vp, v, m->size); if (!m->sqrt (m, rp, up, vp, scratch)) { mpz_mul_ui (u, u, z); mpz_mod (u, u, p); mpz_limbs_copy (up, u, m->size); if (!m->sqrt (m, rp, up, vp, scratch)) { fprintf (stderr, "m->sqrt returned failure, bit_size = %d\n" "u = 0x", m->bit_size); mpz_out_str (stderr, 16, u); fprintf (stderr, "\nv = 0x"); mpz_out_str (stderr, 16, v); fprintf (stderr, "\n"); abort (); } } /* Check that r^2 v = u */ mpz_roinit_n (r, rp, m->size); mpz_mul (t, r, r); mpz_mul (t, t, v); if (!mpz_congruent_p (t, u, p)) { fprintf (stderr, "m->sqrt gave incorrect result, bit_size = %d\n" "u = 0x", m->bit_size); mpz_out_str (stderr, 16, u); fprintf (stderr, "\nv = 0x"); mpz_out_str (stderr, 16, v); fprintf (stderr, "\nr = 0x"); mpz_out_str (stderr, 16, r); fprintf (stderr, "\n"); abort (); } } mpz_clear (u); mpz_clear (v); mpz_clear (t); free (up); free (vp); free (rp); free (scratch); }
int sm2_enc ( sm2_pubkey *pubkey, unsigned char *plaintext, unsigned int plen, unsigned char *ciphertext, unsigned int *clen ) { mpz_t k; point_affn_t kG; unsigned int c1len, xylen; #ifndef MUL_BITS unsigned char tmp[FIELD_SIZE_IN_BYTES*2]; #else unsigned char tmp[32 * 2]; #endif unsigned int i; if( !ciphertext ) { *clen = FIELD_SIZE_IN_BYTES+1+plen+SM3_HASH_LEN; return 0; } else { if( *clen < (FIELD_SIZE_IN_BYTES+1+plen+SM3_HASH_LEN) ) return 1; } mpz_init(k); NN_BarrettSetBuf(&pXbufSubgrpOrder); random_limit(k, SUBGRP_ORDER); NN_BarrettSetBuf(&pXbufFieldPrime); #ifdef USE_ECC_256 //mpz_set_str(k, "4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F", 16); #else //mpz_set_str(k, "ADB6F4FE3E8B1D9E0DA8C0D40FC962195DFAE76F5656467", 16); #endif point_affn_init(kG); point_affn_mul(kG, GENERATOR, k); // dump_point(kG, "kG"); c1len = *clen; EC2OSP(ciphertext,(int *) &c1len, kG, pubkey->ecp); point_affn_clear(kG); point_affn_init(kG); point_affn_mul(kG, pubkey->sG, k); // dump_point(kG, "kG"); mpz_clear(k); xylen = sizeof(tmp); EC2OSP_XY(tmp, (int *)&xylen, kG); point_affn_clear(kG); dump_mem(tmp, 0x30, "tmp"); sm2_hash(tmp, xylen/2, plaintext, plen, tmp+xylen/2, xylen/2, ciphertext+c1len); sm2_KDF1_ex(ciphertext+c1len+SM3_HASH_LEN, plen, tmp, xylen, ALG_HASH_SM3, 1); for(i=0; i<plen; i++) ciphertext[c1len+SM3_HASH_LEN+i] ^= plaintext[i]; *clen = c1len+plen+SM3_HASH_LEN; return 0; }
int main(void) { int i, result; flint_rand_t state; printf("equal...."); fflush(stdout); flint_randinit(state); for (i = 0; i < 100000; i++) { fmpz_t a, b; fmpz_init(a); fmpz_init(b); fmpz_randtest(a, state, 200); fmpz_set(b, a); result = (fmpz_equal(a, b)); if (!result) { printf("FAIL:\n"); printf("a = "), fmpz_print(a), printf("\n"); printf("b = "), fmpz_print(b), printf("\n"); abort(); } fmpz_clear(a); fmpz_clear(b); } for (i = 0; i < 100000; i++) { fmpz_t a, b; mpz_t c, d; fmpz_init(a); fmpz_init(b); mpz_init(c); mpz_init(d); fmpz_randtest(a, state, 200); fmpz_randtest(b, state, 200); fmpz_get_mpz(c, a); fmpz_get_mpz(d, b); result = (fmpz_equal(a, b) == (mpz_cmp(c, d) == 0)); if (!result) { printf("FAIL:\n"); gmp_printf("c = %Zd, d = %Zd\n", c, d); abort(); } fmpz_clear(a); fmpz_clear(b); mpz_clear(c); mpz_clear(d); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
int main (int argc, char *argv[]) { const char usage[] = "usage: findlc [-dv] m2exp [low_merit [high_merit]]\n"; int f; int v_lose, m_lose, v_best, m_best; int c; int debug = 1; int cnt_high_merit; mpz_t m; unsigned long int m2exp; #define DIMS 6 /* dimensions run in spectral test */ mpf_t v[DIMS-1]; /* spectral test result (there's no v for 1st dimension */ mpf_t f_merit, low_merit, high_merit; mpz_t acc, minus8; mpz_t min, max; mpz_t s; mpz_init (m); mpz_init (a); for (f = 0; f < DIMS-1; f++) mpf_init (v[f]); mpf_init (f_merit); mpf_init_set_d (low_merit, .1); mpf_init_set_d (high_merit, .1); while ((c = getopt (argc, argv, "a:di:hv")) != -1) switch (c) { case 'd': /* debug */ g_debug++; break; case 'v': /* print version */ puts (rcsid[1]); exit (0); case 'h': case '?': default: fputs (usage, stderr); exit (1); } argc -= optind; argv += optind; if (argc < 1) { fputs (usage, stderr); exit (1); } /* Install signal handler. */ if (SIG_ERR == signal (SIGSEGV, sh_status)) { perror ("signal (SIGSEGV)"); exit (1); } if (SIG_ERR == signal (SIGHUP, sh_status)) { perror ("signal (SIGHUP)"); exit (1); } printf ("findlc: version: %s\n", rcsid[1]); m2exp = atol (argv[0]); mpz_init_set_ui (m, 1); mpz_mul_2exp (m, m, m2exp); printf ("m = 0x"); mpz_out_str (stdout, 16, m); puts (""); if (argc > 1) /* have low_merit */ mpf_set_str (low_merit, argv[1], 0); if (argc > 2) /* have high_merit */ mpf_set_str (high_merit, argv[2], 0); if (debug) { fprintf (stderr, "low_merit = "); mpf_out_str (stderr, 10, 2, low_merit); fprintf (stderr, "; high_merit = "); mpf_out_str (stderr, 10, 2, high_merit); fputs ("\n", stderr); } mpz_init (minus8); mpz_set_si (minus8, -8L); mpz_init_set_ui (acc, 0); mpz_init (s); mpz_init_set_d (min, 0.01 * pow (2.0, (double) m2exp)); mpz_init_set_d (max, 0.99 * pow (2.0, (double) m2exp)); mpz_true_random (s, m2exp); /* Start. */ mpz_setbit (s, 0); /* Make it odd. */ v_best = m_best = 2*(DIMS-1); for (;;) { mpz_add (acc, acc, s); mpz_mod_2exp (acc, acc, m2exp); #if later mpz_and_si (a, acc, -8L); #else mpz_and (a, acc, minus8); #endif mpz_add_ui (a, a, 5); if (mpz_cmp (a, min) <= 0 || mpz_cmp (a, max) >= 0) continue; spectral_test (v, DIMS, a, m); for (f = 0, v_lose = m_lose = 0, cnt_high_merit = DIMS-1; f < DIMS-1; f++) { merit (f_merit, f + 2, v[f], m); if (mpf_cmp_ui (v[f], 1 << (30 / (f + 2) + (f == 2))) < 0) v_lose++; if (mpf_cmp (f_merit, low_merit) < 0) m_lose++; if (mpf_cmp (f_merit, high_merit) >= 0) cnt_high_merit--; } if (0 == v_lose && 0 == m_lose) { mpz_out_str (stdout, 10, a); puts (""); fflush (stdout); if (0 == cnt_high_merit) break; /* leave loop */ } if (v_lose < v_best) { v_best = v_lose; printf ("best (v_lose=%d; m_lose=%d): ", v_lose, m_lose); mpz_out_str (stdout, 10, a); puts (""); fflush (stdout); } if (m_lose < m_best) { m_best = m_lose; printf ("best (v_lose=%d; m_lose=%d): ", v_lose, m_lose); mpz_out_str (stdout, 10, a); puts (""); fflush (stdout); } } mpz_clear (m); mpz_clear (a); for (f = 0; f < DIMS-1; f++) mpf_clear (v[f]); mpf_clear (f_merit); mpf_clear (low_merit); mpf_clear (high_merit); printf ("done.\n"); return 0; }
int main(int argc, char **argv) { pairing_t pairing; element_t g1, u1, up1, g2, u2, up2, r; mpz_t r_mpz; element_pp_t g1_pp, g2_pp; double t0, t1; int i, n; printf("reading pairing from stdin...\n"); pbc_demo_pairing_init(pairing, argc, argv); element_init(r, pairing->Zr); element_init(g1, pairing->G1); element_init(u1, pairing->G1); element_init(up1, pairing->G1); element_init(g2, pairing->G2); element_init(u2, pairing->G2); element_init(up2, pairing->G2); element_random(r); element_random(g1); element_random(g2); mpz_init(r_mpz); element_to_mpz(r_mpz, r); element_pp_init(g1_pp, g1); element_pp_init(g2_pp, g2); n = 100; t0 = pbc_get_time(); for (i=0; i<n; i++) { element_pow_mpz(u1, g1, r_mpz); } t1 = pbc_get_time(); printf("G1 exp:\t\t%fs\n", t1 - t0); n = 100; t0 = pbc_get_time(); for (i=0; i<n; i++) { element_pow_mpz(u2, g2, r_mpz); } t1 = pbc_get_time(); printf("G2 exp:\t\t%fs\n", t1 - t0); n = 100; t0 = pbc_get_time(); for (i=0; i<n; i++) { element_pp_pow(up1, r_mpz, g1_pp); } t1 = pbc_get_time(); printf("G1 pp exp:\t%fs\n", t1 - t0); n = 100; t0 = pbc_get_time(); for (i=0; i<n; i++) { element_pp_pow(up2, r_mpz, g2_pp); } t1 = pbc_get_time(); printf("G2 pp exp:\t%fs\n", t1 - t0); if (element_cmp(u1, up1)) { printf("Oops 1!\n"); } if (element_cmp(u2, up2)) { printf("Oops 2!\n"); } mpz_clear(r_mpz); element_clear(g1); element_clear(u1); element_clear(up1); element_clear(g2); element_clear(u2); element_clear(up2); element_clear(r); element_pp_clear(g1_pp); element_pp_clear(g2_pp); pairing_clear(pairing); return 0; }
RSA::~RSA() { mpz_clear(n); mpz_clear(d); }
int mpfr_grandom (mpfr_ptr rop1, mpfr_ptr rop2, gmp_randstate_t rstate, mpfr_rnd_t rnd) { int inex1, inex2, s1, s2; mpz_t x, y, xp, yp, t, a, b, s; mpfr_t sfr, l, r1, r2; mpfr_prec_t tprec, tprec0; inex2 = inex1 = 0; if (rop2 == NULL) /* only one output requested. */ { tprec0 = MPFR_PREC (rop1); } else { tprec0 = MAX (MPFR_PREC (rop1), MPFR_PREC (rop2)); } tprec0 += 11; /* We use "Marsaglia polar method" here (cf. George Marsaglia, Normal (Gaussian) random variables for supercomputers The Journal of Supercomputing, Volume 5, Number 1, 49–55 DOI: 10.1007/BF00155857). First we draw uniform x and y in [0,1] using mpz_urandomb (in fixed precision), and scale them to [-1, 1]. */ mpz_init (xp); mpz_init (yp); mpz_init (x); mpz_init (y); mpz_init (t); mpz_init (s); mpz_init (a); mpz_init (b); mpfr_init2 (sfr, MPFR_PREC_MIN); mpfr_init2 (l, MPFR_PREC_MIN); mpfr_init2 (r1, MPFR_PREC_MIN); if (rop2 != NULL) mpfr_init2 (r2, MPFR_PREC_MIN); mpz_set_ui (xp, 0); mpz_set_ui (yp, 0); for (;;) { tprec = tprec0; do { mpz_urandomb (xp, rstate, tprec); mpz_urandomb (yp, rstate, tprec); mpz_mul (a, xp, xp); mpz_mul (b, yp, yp); mpz_add (s, a, b); } while (mpz_sizeinbase (s, 2) > tprec * 2); /* x^2 + y^2 <= 2^{2tprec} */ for (;;) { /* FIXME: compute s as s += 2x + 2y + 2 */ mpz_add_ui (a, xp, 1); mpz_add_ui (b, yp, 1); mpz_mul (a, a, a); mpz_mul (b, b, b); mpz_add (s, a, b); if ((mpz_sizeinbase (s, 2) <= 2 * tprec) || ((mpz_sizeinbase (s, 2) == 2 * tprec + 1) && (mpz_scan1 (s, 0) == 2 * tprec))) goto yeepee; /* Extend by 32 bits */ mpz_mul_2exp (xp, xp, 32); mpz_mul_2exp (yp, yp, 32); mpz_urandomb (x, rstate, 32); mpz_urandomb (y, rstate, 32); mpz_add (xp, xp, x); mpz_add (yp, yp, y); tprec += 32; mpz_mul (a, xp, xp); mpz_mul (b, yp, yp); mpz_add (s, a, b); if (mpz_sizeinbase (s, 2) > tprec * 2) break; } } yeepee: /* FIXME: compute s with s -= 2x + 2y + 2 */ mpz_mul (a, xp, xp); mpz_mul (b, yp, yp); mpz_add (s, a, b); /* Compute the signs of the output */ mpz_urandomb (x, rstate, 2); s1 = mpz_tstbit (x, 0); s2 = mpz_tstbit (x, 1); for (;;) { /* s = xp^2 + yp^2 (loop invariant) */ mpfr_set_prec (sfr, 2 * tprec); mpfr_set_prec (l, tprec); mpfr_set_z (sfr, s, MPFR_RNDN); /* exact */ mpfr_mul_2si (sfr, sfr, -2 * tprec, MPFR_RNDN); /* exact */ mpfr_log (l, sfr, MPFR_RNDN); mpfr_neg (l, l, MPFR_RNDN); mpfr_mul_2si (l, l, 1, MPFR_RNDN); mpfr_div (l, l, sfr, MPFR_RNDN); mpfr_sqrt (l, l, MPFR_RNDN); mpfr_set_prec (r1, tprec); mpfr_mul_z (r1, l, xp, MPFR_RNDN); mpfr_div_2ui (r1, r1, tprec, MPFR_RNDN); /* exact */ if (s1) mpfr_neg (r1, r1, MPFR_RNDN); if (MPFR_CAN_ROUND (r1, tprec - 2, MPFR_PREC (rop1), rnd)) { if (rop2 != NULL) { mpfr_set_prec (r2, tprec); mpfr_mul_z (r2, l, yp, MPFR_RNDN); mpfr_div_2ui (r2, r2, tprec, MPFR_RNDN); /* exact */ if (s2) mpfr_neg (r2, r2, MPFR_RNDN); if (MPFR_CAN_ROUND (r2, tprec - 2, MPFR_PREC (rop2), rnd)) break; } else break; } /* Extend by 32 bits */ mpz_mul_2exp (xp, xp, 32); mpz_mul_2exp (yp, yp, 32); mpz_urandomb (x, rstate, 32); mpz_urandomb (y, rstate, 32); mpz_add (xp, xp, x); mpz_add (yp, yp, y); tprec += 32; mpz_mul (a, xp, xp); mpz_mul (b, yp, yp); mpz_add (s, a, b); } inex1 = mpfr_set (rop1, r1, rnd); if (rop2 != NULL) { inex2 = mpfr_set (rop2, r2, rnd); inex2 = mpfr_check_range (rop2, inex2, rnd); } inex1 = mpfr_check_range (rop1, inex1, rnd); if (rop2 != NULL) mpfr_clear (r2); mpfr_clear (r1); mpfr_clear (l); mpfr_clear (sfr); mpz_clear (b); mpz_clear (a); mpz_clear (s); mpz_clear (t); mpz_clear (y); mpz_clear (x); mpz_clear (yp); mpz_clear (xp); return INEX (inex1, inex2); }
int mpfr_zeta_ui (mpfr_ptr z, unsigned long m, mpfr_rnd_t r) { MPFR_ZIV_DECL (loop); if (m == 0) { mpfr_set_ui (z, 1, r); mpfr_div_2ui (z, z, 1, r); MPFR_CHANGE_SIGN (z); MPFR_RET (0); } else if (m == 1) { MPFR_SET_INF (z); MPFR_SET_POS (z); mpfr_set_divby0 (); return 0; } else /* m >= 2 */ { mpfr_prec_t p = MPFR_PREC(z); unsigned long n, k, err, kbits; mpz_t d, t, s, q; mpfr_t y; int inex; if (r == MPFR_RNDA) r = MPFR_RNDU; /* since the result is always positive */ if (m >= p) /* 2^(-m) < ulp(1) = 2^(1-p). This means that 2^(-m) <= 1/2*ulp(1). We have 3^(-m)+4^(-m)+... < 2^(-m) i.e. zeta(m) < 1+2*2^(-m) for m >= 3 */ { if (m == 2) /* necessarily p=2 */ return mpfr_set_ui_2exp (z, 13, -3, r); else if (r == MPFR_RNDZ || r == MPFR_RNDD || (r == MPFR_RNDN && m > p)) { mpfr_set_ui (z, 1, r); return -1; } else { mpfr_set_ui (z, 1, r); mpfr_nextabove (z); return 1; } } /* now treat also the case where zeta(m) - (1+1/2^m) < 1/2*ulp(1), and the result is either 1+2^(-m) or 1+2^(-m)+2^(1-p). */ mpfr_init2 (y, 31); if (m >= p / 2) /* otherwise 4^(-m) > 2^(-p) */ { /* the following is a lower bound for log(3)/log(2) */ mpfr_set_str_binary (y, "1.100101011100000000011010001110"); mpfr_mul_ui (y, y, m, MPFR_RNDZ); /* lower bound for log2(3^m) */ if (mpfr_cmp_ui (y, p + 2) >= 0) { mpfr_clear (y); mpfr_set_ui (z, 1, MPFR_RNDZ); mpfr_div_2ui (z, z, m, MPFR_RNDZ); mpfr_add_ui (z, z, 1, MPFR_RNDZ); if (r != MPFR_RNDU) return -1; mpfr_nextabove (z); return 1; } } mpz_init (s); mpz_init (d); mpz_init (t); mpz_init (q); p += MPFR_INT_CEIL_LOG2(p); /* account of the n term in the error */ p += MPFR_INT_CEIL_LOG2(p) + 15; /* initial value */ MPFR_ZIV_INIT (loop, p); for(;;) { /* 0.39321985067869744 = log(2)/log(3+sqrt(8)) */ n = 1 + (unsigned long) (0.39321985067869744 * (double) p); err = n + 4; mpfr_set_prec (y, p); /* computation of the d[k] */ mpz_set_ui (s, 0); mpz_set_ui (t, 1); mpz_mul_2exp (t, t, 2 * n - 1); /* t[n] */ mpz_set (d, t); for (k = n; k > 0; k--) { count_leading_zeros (kbits, k); kbits = GMP_NUMB_BITS - kbits; /* if k^m is too large, use mpz_tdiv_q */ if (m * kbits > 2 * GMP_NUMB_BITS) { /* if we know in advance that k^m > d, then floor(d/k^m) will be zero below, so there is no need to compute k^m */ kbits = (kbits - 1) * m + 1; /* k^m has at least kbits bits */ if (kbits > mpz_sizeinbase (d, 2)) mpz_set_ui (q, 0); else { mpz_ui_pow_ui (q, k, m); mpz_tdiv_q (q, d, q); } } else /* use several mpz_tdiv_q_ui calls */ { unsigned long km = k, mm = m - 1; while (mm > 0 && km < ULONG_MAX / k) { km *= k; mm --; } mpz_tdiv_q_ui (q, d, km); while (mm > 0) { km = k; mm --; while (mm > 0 && km < ULONG_MAX / k) { km *= k; mm --; } mpz_tdiv_q_ui (q, q, km); } } if (k % 2) mpz_add (s, s, q); else mpz_sub (s, s, q); /* we have d[k] = sum(t[i], i=k+1..n) with t[i] = n*(n+i-1)!*4^i/(n-i)!/(2i)! t[k-1]/t[k] = k*(2k-1)/(n-k+1)/(n+k-1)/2 */ #if (GMP_NUMB_BITS == 32) #define KMAX 46341 /* max k such that k*(2k-1) < 2^32 */ #elif (GMP_NUMB_BITS == 64) #define KMAX 3037000500 #endif #ifdef KMAX if (k <= KMAX) mpz_mul_ui (t, t, k * (2 * k - 1)); else #endif { mpz_mul_ui (t, t, k); mpz_mul_ui (t, t, 2 * k - 1); } mpz_fdiv_q_2exp (t, t, 1); /* Warning: the test below assumes that an unsigned long has no padding bits. */ if (n < 1UL << ((sizeof(unsigned long) * CHAR_BIT) / 2)) /* (n - k + 1) * (n + k - 1) < n^2 */ mpz_divexact_ui (t, t, (n - k + 1) * (n + k - 1)); else { mpz_divexact_ui (t, t, n - k + 1); mpz_divexact_ui (t, t, n + k - 1); } mpz_add (d, d, t); } /* multiply by 1/(1-2^(1-m)) = 1 + 2^(1-m) + 2^(2-m) + ... */ mpz_fdiv_q_2exp (t, s, m - 1); do { err ++; mpz_add (s, s, t); mpz_fdiv_q_2exp (t, t, m - 1); } while (mpz_cmp_ui (t, 0) > 0); /* divide by d[n] */ mpz_mul_2exp (s, s, p); mpz_tdiv_q (s, s, d); mpfr_set_z (y, s, MPFR_RNDN); mpfr_div_2ui (y, y, p, MPFR_RNDN); err = MPFR_INT_CEIL_LOG2 (err); if (MPFR_LIKELY(MPFR_CAN_ROUND (y, p - err, MPFR_PREC(z), r))) break; MPFR_ZIV_NEXT (loop, p); } MPFR_ZIV_FREE (loop); mpz_clear (d); mpz_clear (t); mpz_clear (q); mpz_clear (s); inex = mpfr_set (z, y, r); mpfr_clear (y); return inex; } }
int main (int argc, char **argv) { mpz_t dividend; mpz_t quotient, remainder; mpz_t quotient2, remainder2; mpz_t temp; mp_size_t dividend_size; mpir_ui divisor; int i; int reps = 10000; gmp_randstate_t rands; mpz_t bs; mpir_ui bsi, size_range; mpir_ui r_rq, r_q, r_r, r; tests_start (); gmp_randinit_default(rands); mpz_init (bs); if (argc == 2) reps = atoi (argv[1]); mpz_init (dividend); mpz_init (quotient); mpz_init (remainder); mpz_init (quotient2); mpz_init (remainder2); mpz_init (temp); for (i = 0; i < reps; i++) { mpz_urandomb (bs, rands, 32); size_range = mpz_get_ui (bs) % 10 + 2; /* 0..2047 bit operands */ do { mpz_rrandomb (bs, rands, 64); divisor = mpz_get_ui (bs); } while (divisor == 0); mpz_urandomb (bs, rands, size_range); dividend_size = mpz_get_ui (bs); mpz_rrandomb (dividend, rands, dividend_size); mpz_urandomb (bs, rands, 2); bsi = mpz_get_ui (bs); if ((bsi & 1) != 0) mpz_neg (dividend, dividend); /* printf ("%ld\n", SIZ (dividend)); */ r_rq = mpz_cdiv_qr_ui (quotient, remainder, dividend, divisor); r_q = mpz_cdiv_q_ui (quotient2, dividend, divisor); r_r = mpz_cdiv_r_ui (remainder2, dividend, divisor); r = mpz_cdiv_ui (dividend, divisor); /* First determine that the quotients and remainders computed with different functions are equal. */ if (mpz_cmp (quotient, quotient2) != 0) dump_abort ("quotients from mpz_cdiv_qr_ui and mpz_cdiv_q_ui differ", dividend, divisor); if (mpz_cmp (remainder, remainder2) != 0) dump_abort ("remainders from mpz_cdiv_qr_ui and mpz_cdiv_r_ui differ", dividend, divisor); /* Check if the sign of the quotient is correct. */ if (mpz_cmp_ui (quotient, 0) != 0) if ((mpz_cmp_ui (quotient, 0) < 0) != (mpz_cmp_ui (dividend, 0) < 0)) dump_abort ("quotient sign wrong", dividend, divisor); /* Check if the remainder has the opposite sign as the (positive) divisor (quotient rounded towards minus infinity). */ if (mpz_cmp_ui (remainder, 0) != 0) if (mpz_cmp_ui (remainder, 0) > 0) dump_abort ("remainder sign wrong", dividend, divisor); mpz_mul_ui (temp, quotient, divisor); mpz_add (temp, temp, remainder); if (mpz_cmp (temp, dividend) != 0) dump_abort ("n mod d != n - [n/d]*d", dividend, divisor); mpz_abs (remainder, remainder); if (mpz_cmp_ui (remainder, divisor) >= 0) dump_abort ("remainder greater than divisor", dividend, divisor); if (mpz_cmp_ui (remainder, r_rq) != 0) dump_abort ("remainder returned from mpz_cdiv_qr_ui is wrong", dividend, divisor); if (mpz_cmp_ui (remainder, r_q) != 0) dump_abort ("remainder returned from mpz_cdiv_q_ui is wrong", dividend, divisor); if (mpz_cmp_ui (remainder, r_r) != 0) dump_abort ("remainder returned from mpz_cdiv_r_ui is wrong", dividend, divisor); if (mpz_cmp_ui (remainder, r) != 0) dump_abort ("remainder returned from mpz_cdiv_ui is wrong", dividend, divisor); } mpz_clear (bs); mpz_clear (dividend); mpz_clear (quotient); mpz_clear (remainder); mpz_clear (quotient2); mpz_clear (remainder2); mpz_clear (temp); gmp_randclear(rands); tests_end (); exit (0); }
void table (int limb_bits, int nail_bits) { int numb_bits = limb_bits - nail_bits; int base; mpz_t r, t, logb2, log2b; mpz_init (r); mpz_init (t); mpz_init (logb2); mpz_init (log2b); printf ("/* This file generated by gen-bases.c - DO NOT EDIT. */\n"); printf ("\n"); printf ("#include \"gmp.h\"\n"); printf ("#include \"gmp-impl.h\"\n"); printf ("\n"); printf ("#if GMP_NUMB_BITS != %d\n", numb_bits); printf ("Error, error, this data is for %d bits\n", numb_bits); printf ("#endif\n"); printf ("\n"); puts ("const struct bases mp_bases[257] =\n{"); puts (" /* 0 */ { 0, 0, 0, 0, 0 },"); puts (" /* 1 */ { 0, 0, 0, 0, 0 },"); for (base = 2; base <= 256; base++) { generate (limb_bits, nail_bits, base); mp_2logb (r, base, limb_bits + 8); mpz_tdiv_q_2exp (logb2, r, 8); mpz_set_ui (t, 1); mpz_mul_2exp (t, t, 2*limb_bits + 5); mpz_sub_ui (t, t, 1); mpz_add_ui (r, r, 1); mpz_tdiv_q (log2b, t, r); printf (" /* %3u */ { ", base); if (POW2_P (base)) { mpz_set_ui (big_base, ulog2 (base) - 1); mpz_set_ui (big_base_inverted, 0); } printf ("%u,", chars_per_limb); printf (" CNST_LIMB(0x"); mpz_out_str (stdout, 16, logb2); printf ("), CNST_LIMB(0x"); mpz_out_str (stdout, 16, log2b); printf ("), CNST_LIMB(0x"); mpz_out_str (stdout, 16, big_base); printf ("), CNST_LIMB(0x"); mpz_out_str (stdout, 16, big_base_inverted); printf (") },\n"); } puts ("};"); mpz_clear (r); mpz_clear (t); mpz_clear (logb2); mpz_clear (log2b); }
void llln_swapk (int k, int kmax, int C, int F) { int i,j; mpz_t lamb; mpz_t auxi1; mpz_t t; mpz_t swap; mpz_init (lamb); mpz_init (auxi1); mpz_init (t); mpz_init (swap); for (j=1; j<F+1 ;j++) { mpz_set (swap, llln_H[k][j]); mpz_set (llln_H[k][j], llln_H[k-1][j]); mpz_set (llln_H[k-1][j], swap); } for (j=1; j<C+1 ;j++) { mpz_set (swap, llln_b[k][j]); mpz_set (llln_b[k][j], llln_b[k-1][j]); mpz_set (llln_b[k-1][j], swap); } if (k>2) { for (j=1;j<=k-2;j++) { mpz_set (swap, llln_lambda[k][j]); mpz_set (llln_lambda[k][j], llln_lambda[k-1][j]); mpz_set (llln_lambda[k-1][j], swap); } } mpz_set (lamb, llln_lambda[k][k-1]); if (mpz_sgn (lamb) == 0) { mpz_set (llln_d[k-1], llln_d[k-2]); llln_f[k-1]= 0; llln_f[k]= 1; mpz_set_ui (llln_lambda[k][k-1], 0); for (j=k+1; j <= kmax ; j++) { mpz_set (llln_lambda[j][k], llln_lambda[j][k-1]); mpz_set_ui (llln_lambda[j][k-1],0); } } else { for (j=k+1; j <= kmax ; j++)s { mpz_mul (auxi1, lamb, llln_lambda[j][k-1]); mpz_tdiv_q (llln_lambda[j][k-1], auxi1, llln_d[k-1]); } mpz_set (t, llln_d[k]); mpz_mul (auxi1, lamb, lamb); mpz_tdiv_q (llln_d[k-1], auxi1, llln_d[k-1]); mpz_set (llln_d[k], llln_d[k-1]); for (j=k+1; j <= kmax -1 ; j++) { for (i=j+1; i<= kmax; i++) { mpz_mul (auxi1, llln_lambda[i][j], llln_d[k-1]); mpz_tdiv_q (llln_lambda[i][j], auxi1, t); } } for (j=k+1; j<= kmax; j++) { mpz_mul (auxi1, llln_d[j], llln_d[k-1]); mpz_tdiv_q (llln_d[j], auxi1, t); } } mpz_clear (auxi1); mpz_clear (lamb); mpz_clear (t); mpz_clear (swap); }
void close() { mpz_clear(m_gmpMpz); }
void main (void) { int i, j, k, kmax, r; int F,C; mpz_t t; mpz_t prod; mpz_t u; mpz_t auxi1; mpz_t auxi2; mpz_init (prod); mpz_init (u); mpz_init (auxi1); mpz_init (auxi2); mpz_init (t); k = 2; kmax = 1; llln_b=llln_proc_entrada(&F,&C); llln_H=new (mpz_t *)[F+1]; for (i=1; i<=F; i++) { llln_H[i]=new mpz_t[F+1]; for (j=1; j<F+1; j++) { mpz_init (llln_H[i][j]); if (i==j) mpz_set_ui (llln_H[i][j],1); else mpz_set_ui (llln_H[i][j],0); } } llln_f=new int[F+1]; llln_d=new mpz_t[F+1]; llln_lambda=new (mpz_t *)[F+1]; mpz_init (llln_d[0]); for (i=1; i<=F; i++) { mpz_init (llln_d[i]); llln_lambda[i]=new mpz_t[F+1]; for (j=1; j<=F; j++) mpz_init(llln_lambda[i][j]); } mpz_set_ui (llln_d[0],1); llln_producto (llln_b[1],llln_b[1], C, &prod); mpz_set (t, prod); if (mpz_cmp_ui (t,0) != 0 ) { mpz_set (llln_d[1], t); llln_f[1]=1; } else { mpz_set_ui (llln_d[1],1); llln_f[1]=0; } while (k <= F) { if (k > kmax) { kmax = k; for (j=1;j<=k;j++) { if (llln_f[j]==0 & j<k) mpz_set_ui (llln_lambda[k][j], 0); else { llln_producto (llln_b[k],llln_b[j], C, &prod); mpz_set (u, prod); for (i=1; i<=j-1; i++) { if (llln_f[i] != 0) { mpz_mul (auxi1, llln_d[i], u); mpz_mul (auxi2, llln_lambda[k][i], llln_lambda[j][i]); mpz_sub (u, auxi1, auxi2); mpz_tdiv_q ( u, u, llln_d[i-1]); } } if (j<k) { mpz_set (llln_lambda[k][j], u); } else { if (mpz_sgn (u) == 0) { mpz_set (llln_d[k], llln_d[k-1]); llln_f[k]=0; } else { mpz_set (llln_d[k], u); llln_f[k]=1; } } } } } llln_test (&k, kmax, C, F); for (i=k-2; i>0; i--) { if (llln_f[i] != 0) llln_redi (k,i,C,F); } k = k+1; } r=0; i=1; while (llln_f[i] == 0 & i<=F) r = i++; for (i=1; i<=r; i++) { printf("\n"); for (j=1; j<=F; j++) { fprintf(stdout, " "); mpz_out_str (stdout, 0, llln_H[i][j]); fprintf(stdout, " "); } printf ("\n"); } mpz_clear (auxi1); mpz_clear (auxi2); mpz_clear (u); mpz_clear (prod); mpz_clear (t); for (i = 1; i <= F; i++) { mpz_clear (llln_d[i]); for (j = 1; j <= F; j++) mpz_clear (llln_lambda[i][j]); mpz_clear (llln_H[i][j]); delete[]llln_lambda[i]; delete[]llln_H[i]; } delete[]llln_lambda; delete[]llln_H; delete[]llln_d; delete[]llln_f; for (i = 1; i < F + 1; i++) { for (j = 1; j < C + 1; j++) mpz_clear (llln_b[i][j]); delete[]llln_b[i]; } delete[]llln_b; }
void check_random (long reps) { unsigned long test; gmp_randstate_ptr rands = RANDS; mpf_t a, b, x; mpz_t ds; int hibits, lshift1, lshift2; int xtra; #define HIBITS 10 #define LSHIFT1 10 #define LSHIFT2 10 mpf_set_default_prec ((1 << HIBITS) + (1 << LSHIFT1) + (1 << LSHIFT2)); mpz_init (ds); mpf_inits (a, b, x, NULL); for (test = 0; test < reps; test++) { mpz_urandomb (ds, rands, HIBITS); hibits = mpz_get_ui (ds) + 1; mpz_urandomb (ds, rands, hibits); mpz_setbit (ds, hibits - 1); /* make sure msb is set */ mpf_set_z (a, ds); mpf_set_z (b, ds); mpz_urandomb (ds, rands, LSHIFT1); lshift1 = mpz_get_ui (ds); mpf_mul_2exp (a, a, lshift1 + 1); mpf_mul_2exp (b, b, lshift1 + 1); mpf_add_ui (a, a, 1); /* make a one-bit difference */ mpz_urandomb (ds, rands, LSHIFT2); lshift2 = mpz_get_ui (ds); mpf_mul_2exp (a, a, lshift2); mpf_mul_2exp (b, b, lshift2); mpz_urandomb (ds, rands, lshift2); mpf_set_z (x, ds); mpf_add (a, a, x); mpf_add (b, b, x); insert_random_low_zero_limbs (a, rands); insert_random_low_zero_limbs (b, rands); if (mpf_eq (a, b, lshift1 + hibits) == 0 || mpf_eq (b, a, lshift1 + hibits) == 0) { dump_abort (a, b, lshift1 + hibits, lshift1, lshift2, hibits, 1, test); } for (xtra = 1; xtra < 100; xtra++) if (mpf_eq (a, b, lshift1 + hibits + xtra) != 0 || mpf_eq (b, a, lshift1 + hibits + xtra) != 0) { dump_abort (a, b, lshift1 + hibits + xtra, lshift1, lshift2, hibits, 0, test); } } mpf_clears (a, b, x, NULL); mpz_clear (ds); }
/* Compare the result (z1,inex1) of mpfr_pow with all flags cleared with those of mpfr_pow with all flags set and of the other power functions. Arguments x and y are the input values; sx and sy are their string representations (sx may be null); rnd contains the rounding mode; s is a string containing the function that called test_others. */ static void test_others (const void *sx, const char *sy, mpfr_rnd_t rnd, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z1, int inex1, unsigned int flags, const char *s) { mpfr_t z2; int inex2; int spx = sx != NULL; if (!spx) sx = x; mpfr_init2 (z2, mpfr_get_prec (z1)); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_pow (z2, x, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_pow, flags set"); /* If y is an integer that fits in an unsigned long and is not -0, we can test mpfr_pow_ui. */ if (MPFR_IS_POS (y) && mpfr_integer_p (y) && mpfr_fits_ulong_p (y, MPFR_RNDN)) { unsigned long yy = mpfr_get_ui (y, MPFR_RNDN); mpfr_clear_flags (); inex2 = mpfr_pow_ui (z2, x, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_pow_ui, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_pow_ui (z2, x, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_pow_ui, flags set"); /* If x is an integer that fits in an unsigned long and is not -0, we can also test mpfr_ui_pow_ui. */ if (MPFR_IS_POS (x) && mpfr_integer_p (x) && mpfr_fits_ulong_p (x, MPFR_RNDN)) { unsigned long xx = mpfr_get_ui (x, MPFR_RNDN); mpfr_clear_flags (); inex2 = mpfr_ui_pow_ui (z2, xx, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_ui_pow_ui, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_ui_pow_ui (z2, xx, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_ui_pow_ui, flags set"); } } /* If y is an integer but not -0 and not huge, we can test mpfr_pow_z, and possibly mpfr_pow_si (and possibly mpfr_ui_div). */ if (MPFR_IS_ZERO (y) ? MPFR_IS_POS (y) : (mpfr_integer_p (y) && MPFR_GET_EXP (y) < 256)) { mpz_t yyy; /* If y fits in a long, we can test mpfr_pow_si. */ if (mpfr_fits_slong_p (y, MPFR_RNDN)) { long yy = mpfr_get_si (y, MPFR_RNDN); mpfr_clear_flags (); inex2 = mpfr_pow_si (z2, x, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_pow_si, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_pow_si (z2, x, yy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_pow_si, flags set"); /* If y = -1, we can test mpfr_ui_div. */ if (yy == -1) { mpfr_clear_flags (); inex2 = mpfr_ui_div (z2, 1, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_ui_div, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_ui_div (z2, 1, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_ui_div, flags set"); } /* If y = 2, we can test mpfr_sqr. */ if (yy == 2) { mpfr_clear_flags (); inex2 = mpfr_sqr (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_sqr, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_sqr (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_sqr, flags set"); } } /* Test mpfr_pow_z. */ mpz_init (yyy); mpfr_get_z (yyy, y, MPFR_RNDN); mpfr_clear_flags (); inex2 = mpfr_pow_z (z2, x, yyy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_pow_z, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_pow_z (z2, x, yyy, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_pow_z, flags set"); mpz_clear (yyy); } /* If y = 0.5, we can test mpfr_sqrt, except if x is -0 or -Inf (because the rule for mpfr_pow on these special values is different). */ if (MPFR_IS_PURE_FP (y) && mpfr_cmp_str1 (y, "0.5") == 0 && ! ((MPFR_IS_ZERO (x) || MPFR_IS_INF (x)) && MPFR_IS_NEG (x))) { mpfr_clear_flags (); inex2 = mpfr_sqrt (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_sqrt, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_sqrt (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_sqrt, flags set"); } #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0) /* If y = -0.5, we can test mpfr_rec_sqrt, except if x = -Inf (because the rule for mpfr_pow on -Inf is different). */ if (MPFR_IS_PURE_FP (y) && mpfr_cmp_str1 (y, "-0.5") == 0 && ! (MPFR_IS_INF (x) && MPFR_IS_NEG (x))) { mpfr_clear_flags (); inex2 = mpfr_rec_sqrt (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_rec_sqrt, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_rec_sqrt (z2, x, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_rec_sqrt, flags set"); } #endif /* If x is an integer that fits in an unsigned long and is not -0, we can test mpfr_ui_pow. */ if (MPFR_IS_POS (x) && mpfr_integer_p (x) && mpfr_fits_ulong_p (x, MPFR_RNDN)) { unsigned long xx = mpfr_get_ui (x, MPFR_RNDN); mpfr_clear_flags (); inex2 = mpfr_ui_pow (z2, xx, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_ui_pow, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_ui_pow (z2, xx, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_ui_pow, flags set"); /* If x = 2, we can test mpfr_exp2. */ if (xx == 2) { mpfr_clear_flags (); inex2 = mpfr_exp2 (z2, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_exp2, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_exp2 (z2, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_exp2, flags set"); } /* If x = 10, we can test mpfr_exp10. */ if (xx == 10) { mpfr_clear_flags (); inex2 = mpfr_exp10 (z2, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, flags, s, "mpfr_exp10, flags cleared"); __gmpfr_flags = MPFR_FLAGS_ALL; inex2 = mpfr_exp10 (z2, y, rnd); cmpres (spx, sx, sy, rnd, z1, inex1, z2, inex2, MPFR_FLAGS_ALL, s, "mpfr_exp10, flags set"); } } mpfr_clear (z2); }
void mpi_free( MPI a ) { mpz_clear(a); pfree(a); }
/* here we are just freeing RAM */ void free_state(struct state *st) { delete_event(st); /* delete any pending timer event */ { struct msgid_list *p = st->st_used_msgids; while (p != NULL) { struct msgid_list *q = p; p = p->next; pfree(q); } } unreference_key(&st->st_peer_pubkey); free_sa(st->st_sadb); st->st_sadb=NULL; if (st->st_sec_in_use) { #ifdef HAVE_LIBNSS SECKEYPrivateKey *privk; SECKEYPublicKey *pubk; memcpy(&pubk,st->pubk.ptr,st->pubk.len); SECKEY_DestroyPublicKey(pubk); freeanychunk(st->pubk); memcpy(&privk,st->st_sec_chunk.ptr,st->st_sec_chunk.len); SECKEY_DestroyPrivateKey(privk); #else mpz_clear(&(st->st_sec)); #endif pfreeany(st->st_sec_chunk.ptr); } freeanychunk(st->st_firstpacket_me); freeanychunk(st->st_firstpacket_him); freeanychunk(st->st_tpacket); freeanychunk(st->st_rpacket); freeanychunk(st->st_p1isa); freeanychunk(st->st_gi); freeanychunk(st->st_gr); freeanychunk(st->st_shared); freeanychunk(st->st_ni); freeanychunk(st->st_nr); #ifdef HAVE_LIBNSS free_osw_nss_symkey(st->st_skeyid); free_osw_nss_symkey(st->st_skey_d); free_osw_nss_symkey(st->st_skey_ai); free_osw_nss_symkey(st->st_skey_ar); free_osw_nss_symkey(st->st_skey_ei); free_osw_nss_symkey(st->st_skey_er); free_osw_nss_symkey(st->st_skey_pi); free_osw_nss_symkey(st->st_skey_pr); free_osw_nss_symkey(st->st_enc_key); if(st->st_ah.our_keymat!=NULL) memset(st->st_ah.our_keymat, 0, st->st_ah.keymat_len); if(st->st_ah.peer_keymat!=NULL) memset(st->st_ah.peer_keymat, 0, st->st_ah.keymat_len); if(st->st_esp.our_keymat!=NULL) memset(st->st_esp.our_keymat, 0, st->st_esp.keymat_len); if(st->st_esp.peer_keymat!=NULL) memset(st->st_esp.peer_keymat, 0, st->st_esp.keymat_len); #endif freeanychunk(st->st_skeyid); freeanychunk(st->st_skey_d); freeanychunk(st->st_skey_ai); freeanychunk(st->st_skey_ar); freeanychunk(st->st_skey_ei); freeanychunk(st->st_skey_er); freeanychunk(st->st_skey_pi); freeanychunk(st->st_skey_pr); freeanychunk(st->st_enc_key); pfreeany(st->st_ah.our_keymat); pfreeany(st->st_ah.peer_keymat); pfreeany(st->st_esp.our_keymat); pfreeany(st->st_esp.peer_keymat); freeanychunk(st->st_xauth_password); #ifdef HAVE_LABELED_IPSEC pfreeany(st->sec_ctx); #endif pfree(st); }
static int e_gmp_rsa_finish(RSA *rsa) { E_GMP_RSA_CTX *hptr = RSA_get_ex_data(rsa, hndidx_rsa); if (!hptr) return 0; mpz_clear(hptr->n); mpz_clear(hptr->d); mpz_clear(hptr->e); mpz_clear(hptr->p); mpz_clear(hptr->q); mpz_clear(hptr->dmp1); mpz_clear(hptr->dmq1); mpz_clear(hptr->iqmp); mpz_clear(hptr->r0); mpz_clear(hptr->r1); mpz_clear(hptr->I0); mpz_clear(hptr->m1); OPENSSL_free(hptr); RSA_set_ex_data(rsa, hndidx_rsa, NULL); return 1; }
//============================================ // 四則演算のテストプログラム //============================================ void test_arithmetic_operation(Field f) { int i; unsigned long long int t1, t2; Element a, b, c, d; char loop[] = "100"; mpz_t e, exp; //-------------------- // init //-------------------- element_init(a, f); element_init(b, f); element_init(c, f); element_init(d, f); //-------------------- // add //-------------------- element_set_str(a, "1C12C39A2AD14054EDC9EE504301127AFFEEAADC59A78B50FCFFED87AC6EB8BF 20E1A922384561EA82602CD664D85D442DAC5D391E142ABB3CFEC2A095C22DF9"); element_set_str(b, "F1B91250A124F268B8239185B23B31EB25179A11A9A0398E61B701F7D4F7265 20D206C5F7D007EDBA34A4B041622289D64F04CA28CEAC490619585AA14F7B2F"); element_set_str(d, "7BD59BA97A27FBD2AD60CD0173FC358353DE53D5C418EE8649AFDA729BE2B23 1E42B4E392D45A19EE1EB6EE1F557D8C86F922C32EE2D702C497BAFB3711A927"); element_add(c, a, b); assert(element_cmp(c, d) == 0); t1 = rdtsc(); for (i = 0; i < N; i++) { element_add(c, a, b); } t2 = rdtsc(); printf("element add: %.2lf [clock]\n", (double)(t2 - t1) / N); //-------------------- // sub //-------------------- element_set(d, c); element_sub(c, c, d); assert(element_is_zero(c)); //-------------------- // mul //-------------------- element_mul(c, a, b); element_set_str(d, "1D0562FF0AB317FFDE555320A7072D2B29C07077E08996CE5F093BB8E4200B2C 9B04361A24DC7F37C8BD09A7C51A9D8577168AD021BF2B4AC3D67552F481B1A"); assert(element_cmp(c, d) == 0); t1 = rdtsc(); for (i = 0; i < N; i++) { element_mul(c, a, b); } t2 = rdtsc(); printf("element mul: %.2lf [clock]\n", (double)(t2 - t1) / N); mpz_init_set_str(e, "1B45F16C848B9C476C1D2FF1FD60A0D0C19BBA6F3ECE3CF6C5FCE4FAB7CAD4FF", 16); element_pow(c, a, e); element_set_str(d, "B40190CE812CB4F668A839952128D19B1748F3BB19E902480D089AF9053A6D2 19DA59F09C3C20472C3BD19A4FC95BCAF266B9D1539AAD23E3C67C4F3A7CA51D"); assert(element_cmp(c, d) == 0); mpz_clear(e); //-------------------- // sqr //-------------------- element_sqr(c, a); element_mul(d, a, a); assert(element_cmp(c, d) == 0); t1 = rdtsc(); for (i = 0; i < N; i++) { element_sqr(c, a); } t2 = rdtsc(); printf("element sqr: %.2lf [clock]\n", (double)(t2 - t1) / N); //-------------------- // random //-------------------- element_random(a); element_random(b); //-------------------- // inv //-------------------- element_mul(c, a, b); element_inv(b, b); element_mul(c, c, b); element_inv(d, a); element_mul(d, a, d); assert(element_cmp(c, a) == 0); assert(element_is_one(d)); t1 = rdtsc(); for (i = 0; i < N; i++) { element_inv(b, a); } t2 = rdtsc(); printf("element inv: %.2lf [clock]\n", (double)(t2 - t1) / N); //-------------------- // pow //-------------------- mpz_init_set_str(exp, loop, 10); element_set_one(b); for (i = 0; i < atoi(loop); i++) { element_mul(b, b, a); } element_pow(c, a, exp); assert(element_cmp(b, c) == 0); mpz_set(exp, f->order); for (i = 0; i < 100; i++) { element_random(a); element_pow(b, a, exp); assert(element_cmp(b, a) == 0); } t1 = rdtsc(); for (i = 0; i < N; i++) { element_pow(b, a, exp); } t2 = rdtsc(); printf("element pow with order: %.2lf [clock]\n", (double)(t2 - t1) / N); mpz_clear(exp); //-------------------- // clear //-------------------- element_clear(a); element_clear(b); element_clear(c); element_clear(d); }
static int do_rsa_verify(struct verifier *v, int algorithm, UINT32 length, const UINT8 *msg, UINT32 signature_length, const UINT8 *signature_data) { CAST(rsa_verifier, self, v); mpz_t s; int res = 0; trace("do_rsa_verify: Verifying %a signature\n", algorithm); mpz_init(s); switch(algorithm) { #if 0 case ATOM_RSA_PKCS1_SHA1: case ATOM_RSA_PKCS1_SHA1_LOCAL: if (signature_length > self->size) goto fail; bignum_parse_u(s, signature_length, signature_data); break; case ATOM_SPKI: #endif case ATOM_SSH_RSA: { struct simple_buffer buffer; UINT32 length; const UINT8 *digits; int atom; simple_buffer_init(&buffer, signature_length, signature_data); if (!(parse_atom(&buffer, &atom) && (atom == ATOM_SSH_RSA) && parse_string(&buffer, &length, &digits) && (length <= self->size) && parse_eod(&buffer) )) goto fail; bignum_parse_u(s, length, digits); break; } /* It doesn't matter here which flavour of SPKI is used. */ case ATOM_SPKI_SIGN_RSA: case ATOM_SPKI_SIGN_DSS: { struct simple_buffer buffer; struct sexp *e; simple_buffer_init(&buffer, signature_length, signature_data); if (! ( (e = sexp_parse_canonical(&buffer)) && parse_eod(&buffer) && decode_rsa_sig_val(e, s, self->size)) ) goto fail; break; } default: fatal("do_rsa_verify: Internal error!\n"); } res = rsa_pkcs1_verify(self, length, msg, s); fail: mpz_clear(s); return res; }
static void test_genericz (mpfr_prec_t p0, mpfr_prec_t p1, unsigned int N, int (*func)(mpfr_ptr, mpfr_srcptr, mpz_srcptr, mpfr_rnd_t), const char *op) { mpfr_prec_t prec; mpfr_t arg1, dst_big, dst_small, tmp; mpz_t arg2; mpfr_rnd_t rnd; int inexact, compare, compare2; unsigned int n; mpfr_inits (arg1, dst_big, dst_small, tmp, (mpfr_ptr) 0); mpz_init (arg2); for (prec = p0; prec <= p1; prec++) { mpfr_set_prec (arg1, prec); mpfr_set_prec (tmp, prec); mpfr_set_prec (dst_small, prec); for (n=0; n<N; n++) { mpfr_urandomb (arg1, RANDS); mpz_urandomb (arg2, RANDS, 1024); rnd = RND_RAND (); mpfr_set_prec (dst_big, 2*prec); compare = func(dst_big, arg1, arg2, rnd); if (mpfr_can_round (dst_big, 2*prec, rnd, rnd, prec)) { mpfr_set (tmp, dst_big, rnd); inexact = func(dst_small, arg1, arg2, rnd); if (mpfr_cmp (tmp, dst_small)) { printf ("Results differ for prec=%u rnd_mode=%s and %s_z:\n" "arg1=", (unsigned) prec, mpfr_print_rnd_mode (rnd), op); mpfr_print_binary (arg1); printf("\narg2="); mpz_out_str (stdout, 2, arg2); printf ("\ngot "); mpfr_dump (dst_small); printf ("expected "); mpfr_dump (tmp); printf ("approx "); mpfr_dump (dst_big); exit (1); } compare2 = mpfr_cmp (tmp, dst_big); /* if rounding to nearest, cannot know the sign of t - f(x) because of composed rounding: y = o(f(x)) and t = o(y) */ if (compare * compare2 >= 0) compare = compare + compare2; else compare = inexact; /* cannot determine sign(t-f(x)) */ if (((inexact == 0) && (compare != 0)) || ((inexact > 0) && (compare <= 0)) || ((inexact < 0) && (compare >= 0))) { printf ("Wrong inexact flag for rnd=%s and %s_z:\n" "expected %d, got %d\n", mpfr_print_rnd_mode (rnd), op, compare, inexact); printf ("\narg1="); mpfr_print_binary (arg1); printf ("\narg2="); mpz_out_str(stdout, 2, arg2); printf ("\ndstl="); mpfr_print_binary (dst_big); printf ("\ndsts="); mpfr_print_binary (dst_small); printf ("\ntmp ="); mpfr_dump (tmp); exit (1); } } } } mpz_clear (arg2); mpfr_clears (arg1, dst_big, dst_small, tmp, (mpfr_ptr) 0); }