Esempio n. 1
0
void fp3_sqrn_low(dv3_t c, fp3_t a) {
	align dig_t t0[2 * FP_DIGS], t1[2 * FP_DIGS], t2[2 * FP_DIGS];
	align dig_t t3[2 * FP_DIGS], t4[2 * FP_DIGS], t5[2 * FP_DIGS];

	/* t0 = a_0^2. */
	fp_sqrn_low(t0, a[0]);

	/* t1 = 2 * a_1 * a_2. */
#ifdef FP_SPACE
	fp_dbln_low(t2, a[1]);
#else
	fp_dblm_low(t2, a[1]);
#endif

	fp_muln_low(t1, t2, a[2]);

	/* t2 = a_2^2. */
	fp_sqrn_low(t2, a[2]);

	/* t3 = (a_0 + a_2 + a_1)^2, t4 = (a_0 + a_2 - a_1)^2. */
#ifdef FP_SPACE
	fp_addn_low(t3, a[0], a[2]);
	fp_addn_low(t4, t3, a[1]);
#else
	fp_addm_low(t3, a[0], a[2]);
	fp_addm_low(t4, t3, a[1]);
#endif
	fp_subm_low(t5, t3, a[1]);
	fp_sqrn_low(t3, t4);
	fp_sqrn_low(t4, t5);

	/* t4 = (t4 + t3)/2. */
	fp_addd_low(t4, t4, t3);
	fp_hlvd_low(t4, t4);

	/* t3 = t3 - t4 - t1. */
	fp_addc_low(t5, t1, t4);
	fp_subc_low(t3, t3, t5);

	/* c_2 = t4 - t0 - t2. */
	fp_addc_low(t5, t0, t2);
	fp_subc_low(c[2], t4, t5);

	/* c_0 = t0 + t1 * B. */
	fp_subc_low(c[0], t0, t1);
	for (int i = -1; i > fp_prime_get_cnr(); i--) {
		fp_subc_low(c[0], c[0], t1);
	}

	/* c_1 = t3 + t2 * B. */
	fp_subc_low(c[1], t3, t2);
	for (int i = -1; i > fp_prime_get_cnr(); i--) {
		fp_subc_low(c[1], c[1], t2);
	}
}
Esempio n. 2
0
void fp3_sqr_basic(fp3_t c, fp3_t a) {
	dv_t t0, t1, t2, t3, t4, t5;

	dv_null(t0);
	dv_null(t1);
	dv_null(t2);
	dv_null(t3);
	dv_null(t4);
	dv_null(t5);

	TRY {
		dv_new(t0);
		dv_new(t1);
		dv_new(t2);
		dv_new(t3);
		dv_new(t4);
		dv_new(t5);

		/* t0 = a_0^2. */
		fp_sqrn_low(t0, a[0]);

		/* t1 = 2 * a_1 * a_2. */
		fp_dbl(t2, a[1]);
		fp_muln_low(t1, t2, a[2]);

		/* t2 = a_2^2. */
		fp_sqrn_low(t2, a[2]);

		/* t3 = (a_0 + a_2 + a_1)^2, t4 = (a_0 + a_2 - a_1)^2. */
		fp_add(t3, a[0], a[2]);
		fp_add(t4, t3, a[1]);
		fp_sub(t5, t3, a[1]);
		fp_sqrn_low(t3, t4);
		fp_sqrn_low(t4, t5);

		/* t4 = (t4 + t3)/2. */
		fp_addd_low(t4, t4, t3);
		fp_hlvd_low(t4, t4);

		/* t3 = t3 - t4 - t1. */
		fp_addc_low(t5, t1, t4);
		fp_subc_low(t3, t3, t5);

		/* c_2 = t4 - t0 - t2. */
		fp_addc_low(t5, t0, t2);
		fp_subc_low(t4, t4, t5);
		fp_rdc(c[2], t4);

		/* c_0 = t0 + t1 * B. */
		fp_subc_low(t0, t0, t1);
		for (int i = -1; i > fp_prime_get_cnr(); i--) {
			fp_subc_low(t0, t0, t1);
		}
		fp_rdc(c[0], t0);

		/* c_1 = t3 + t2 * B. */
		fp_subc_low(t3, t3, t2);
		for (int i = -1; i > fp_prime_get_cnr(); i--) {
			fp_subc_low(t3, t3, t2);
		}
		fp_rdc(c[1], t3);
	}
	CATCH_ANY {
		THROW(ERR_CAUGHT);
	}
	FINALLY {
		dv_free(t0);
		dv_free(t1);
		dv_free(t2);
		dv_free(t3);
		dv_free(t4);
		dv_free(t5);
	}
}
Esempio n. 3
0
void fp12_sqr_lazyr(fp12_t c, fp12_t a) {
	fp2_t t0, t1, t2, t3;
	dv2_t u0, u1, u2, u3, u4, u5, u6, u7, u8, u9;

	fp2_null(t0);
	fp2_null(t1);
	fp2_null(t2);
	fp2_null(t3);
	dv2_null(u0);
	dv2_null(u1);
	dv2_null(u2);
	dv2_null(u3);
	dv2_null(u4);
	dv2_null(u5);
	dv2_null(u6);
	dv2_null(u7);
	dv2_null(u8);
	dv2_null(u9);

	TRY {
		fp2_new(t0);
		fp2_new(t1);
		fp2_new(t2);
		fp2_new(t3);
		dv2_new(u0);
		dv2_new(u1);
		dv2_new(u2);
		dv2_new(u3);
		dv2_new(u4);
		dv2_new(u5);
		dv2_new(u6);
		dv2_new(u7);
		dv2_new(u8);
		dv2_new(u9);

		/* a0 = (a00, a11). */
		/* a1 = (a10, a02). */
		/* a2 = (a01, a12). */

		/* (t0,t1) = a0^2 */
		fp4_sqr_unr(u0, u1, a[0][0], a[1][1]);

		/* (t2,t3) = 2 * a1 * a2 */
		fp4_mul_unr(u2, u3, a[1][0], a[0][2], a[0][1], a[1][2]);
		fp2_addc_low(u2, u2, u2);
		fp2_addc_low(u3, u3, u3);

		/* (t4,t5) = a2^2. */
		fp4_sqr_unr(u4, u5, a[0][1], a[1][2]);

		/* c2 = a0 + a2. */
		fp2_addm_low(t2, a[0][0], a[0][1]);
		fp2_addm_low(t3, a[1][1], a[1][2]);

		/* (t6,t7) = (a0 + a2 + a1)^2. */
		fp2_addm_low(t0, t2, a[1][0]);
		fp2_addm_low(t1, t3, a[0][2]);
		fp4_sqr_unr(u6, u7, t0, t1);

		/* c2 = (a0 + a2 - a1)^2. */
		fp2_subm_low(t2, t2, a[1][0]);
		fp2_subm_low(t3, t3, a[0][2]);
		fp4_sqr_unr(u8, u9, t2, t3);

		/* c2 = (c2 + (t6,t7))/2. */
#ifdef FP_SPACE
		fp2_addd_low(u8, u8, u6);
		fp2_addd_low(u9, u9, u7);
#else
		fp2_addc_low(u8, u8, u6);
		fp2_addc_low(u9, u9, u7);
#endif
		fp_hlvd_low(u8[0], u8[0]);
		fp_hlvd_low(u8[1], u8[1]);
		fp_hlvd_low(u9[0], u9[0]);
		fp_hlvd_low(u9[1], u9[1]);

		/* (t6,t7) = (t6,t7) - c2 - (t2,t3). */
		fp2_subc_low(u6, u6, u8);
		fp2_subc_low(u7, u7, u9);
		fp2_subc_low(u6, u6, u2);
		fp2_subc_low(u7, u7, u3);

		/* c2 = c2 - (t0,t1) - (t4,t5). */
		fp2_subc_low(u8, u8, u0);
		fp2_subc_low(u9, u9, u1);
		fp2_subc_low(u8, u8, u4);
		fp2_subc_low(u9, u9, u5);
		fp2_rdcn_low(c[0][1], u8);
		fp2_rdcn_low(c[1][2], u9);

		/* c1 = (t6,t7) + (t4,t5) * E. */
		fp2_nord_low(u9, u5);
		fp2_addc_low(u6, u6, u9);
		fp2_addc_low(u7, u7, u4);
		fp2_rdcn_low(c[1][0], u6);
		fp2_rdcn_low(c[0][2], u7);

		/* c0 = (t0,t1) + (t2,t3) * E. */
		fp2_nord_low(u9, u3);
		fp2_addc_low(u0, u0, u9);
		fp2_addc_low(u1, u1, u2);
		fp2_rdcn_low(c[0][0], u0);
		fp2_rdcn_low(c[1][1], u1);
	} CATCH_ANY {
		THROW(ERR_CAUGHT);
	} FINALLY {
		fp2_free(t0);
		fp2_free(t1);
		fp2_free(t2);
		fp2_free(t3);
		dv2_free(u0);
		dv2_free(u1);
		dv2_free(u2);
		dv2_free(u3);
		dv2_free(u4);
		dv2_free(u5);
		dv2_free(u6);
		dv2_free(u7);
		dv2_free(u8);
		dv2_free(u9);
	}
}