Пример #1
0
void eb_pck(eb_t r, const eb_t p) {
	if (eb_curve_is_super()) {
		/* z3 = y1/c. */
		fb_inv(r->z, eb_curve_get_c());
		fb_mul(r->z, r->z, p->y);
		/* x3 = x1. */
		fb_copy(r->x, p->x);
		/* y3 = b(y1/c). */
		fb_set_dig(r->y, fb_get_bit(r->z, 0));
		/* z3 = 1. */
		fb_set_dig(r->z, 1);
	} else {
		/* z3 = y1/x1. */
		fb_inv(r->z, p->x);
		fb_mul(r->z, r->z, p->y);
		/* x3 = x1. */
		fb_copy(r->x, p->x);
		/* y3 = b(y1/x1). */
		fb_set_dig(r->y, fb_get_bit(r->z, 0));
		/* z3 = 1. */
		fb_set_dig(r->z, 1);
	}

	r->norm = 1;
}
Пример #2
0
void eb_pck(eb_t r, const eb_t p) {
	/* z3 = y1/x1. */
	fb_inv(r->z, p->x);
	fb_mul(r->z, r->z, p->y);
	/* x3 = x1. */
	fb_copy(r->x, p->x);
	/* y3 = b(y1/x1). */
	fb_set_dig(r->y, fb_get_bit(r->z, 0));
	/* z3 = 1. */
	fb_set_dig(r->z, 1);

	r->norm = 1;
}
Пример #3
0
void eb_hlv(eb_t r, const eb_t p) {
	fb_t l, t;

	fb_null(l);
	fb_null(t);

	TRY {
		fb_new(l);
		fb_new(t);

		/* Solve l^2 + l = u + a. */
		switch (eb_curve_opt_a()) {
			case RLC_ZERO:
				fb_copy(t, p->x);
				break;
			case RLC_ONE:
				fb_add_dig(t, p->x, (dig_t)1);
				break;
			case RLC_TINY:
				fb_add_dig(t, p->x, eb_curve_get_a()[0]);
				break;
			default:
				fb_add(t, p->x, eb_curve_get_a());
				break;
		}

		fb_slv(l, t);

		if (p->norm == 1) {
			/* Compute t = v + u * lambda. */
			fb_mul(t, l, p->x);
			fb_add(t, t, p->y);
		} else {
			/* Compute t = u * (u + lambda_P + lambda). */
			fb_add(t, l, p->y);
			fb_add(t, t, p->x);
			fb_mul(t, t, p->x);
		}

		/* If Tr(t) = 0 then lambda_P = lambda, u = sqrt(t + u). */
		if (fb_trc(t) == 0) {
			fb_copy(r->y, l);
			fb_add(t, t, p->x);
			fb_srt(r->x, t);
		} else {
			/* Else lambda_P = lambda + 1, u = sqrt(t). */
			fb_add_dig(r->y, l, 1);
			fb_srt(r->x, t);
		}
		fb_set_dig(r->z, 1);
		r->norm = 2;
	}
	CATCH_ANY {
		THROW(ERR_CAUGHT);
	}
	FINALLY {
		fb_free(l);
		fb_free(t);
	}
}
Пример #4
0
int eb_upk(eb_t r, const eb_t p) {
	fb_t t0, t1;
	int res = 0;

	fb_null(t0);
	fb_null(t1);

	TRY {
		fb_new(t0);
		fb_new(t1);

		eb_rhs(t1, p);

		if (eb_curve_is_super()) {
			/* t0 = c^2. */
			fb_sqr(t0, eb_curve_get_c());
			/* t0 = 1/c^2. */
			fb_inv(t0, t0);
			/* t0 = t1/c^2. */
			fb_mul(t0, t0, t1);
			res = (fb_trc(t0) == 0);
			/* Solve t1^2 + t1 = t0. */
			fb_slv(t1, t0);
			/* If this is not the correct solution, try the other. */
			if (fb_get_bit(t1, 0) != fb_get_bit(p->y, 0)) {
				fb_add_dig(t1, t1, 1);
			}
			/* x3 = x1, y3 = t1 * c, z3 = 1. */
			fb_mul(r->y, t1, eb_curve_get_c());
		} else {
			fb_sqr(t0, p->x);
			/* t0 = 1/x1^2. */
			fb_inv(t0, t0);
			/* t0 = t1/x1^2. */
			fb_mul(t0, t0, t1);
			res = (fb_trc(t0) == 0);
			/* Solve t1^2 + t1 = t0. */
			fb_slv(t1, t0);
			/* If this is not the correct solution, try the other. */
			if (fb_get_bit(t1, 0) != fb_get_bit(p->y, 0)) {
				fb_add_dig(t1, t1, 1);
			}
			/* x3 = x1, y3 = t1 * x1, z3 = 1. */
			fb_mul(r->y, t1, p->x);
		}
		fb_copy(r->x, p->x);
		fb_set_dig(r->z, 1);

		r->norm = 1;
	}
	CATCH_ANY {
		THROW(ERR_CAUGHT);
	}
	FINALLY {
		fb_free(t0);
		fb_free(t1);
	}
	return res;
}
Пример #5
0
void eb_norm_sim(eb_t *r, const eb_t *t, int n) {
	int i;
	fb_t a[n];

	if (n == 1) {
		eb_norm(r[0], t[0]);
		return;
	}

	for (i = 0; i < n; i++) {
		fb_null(a[i]);
	}

	TRY {
		for (i = 0; i < n; i++) {
			fb_new(a[i]);
			if (!eb_is_infty(t[i])) {
				fb_copy(a[i], t[i]->z);
			} else {
				fb_set_dig(a[i], 1);
			}
		}

		fb_inv_sim(a, (const fb_t *)a, n);

		for (i = 0; i < n; i++) {
			fb_copy(r[i]->x, t[i]->x);
			fb_copy(r[i]->y, t[i]->y);
			if (!eb_is_infty(t[i])) {
				fb_copy(r[i]->z, a[i]);
			}
		}
	}
	CATCH_ANY {
		THROW(ERR_CAUGHT);
	}
	FINALLY {
		for (i = 0; i < n; i++) {
			fb_free(a[i]);
		}
	}

#if defined(EB_SUPER)
	if (eb_curve_is_super()) {
		for (i = 0; i < n; i++) {
			eb_norm_super(r[i], r[i], 1);
		}
	}
#endif
#if defined(EB_ORDIN) || defined(EB_KBLTZ)
	if (!eb_curve_is_super()) {
		for (i = 0; i < n; i++) {
			eb_norm_ordin(r[i], r[i], 1);
		}
	}
#endif
}
Пример #6
0
/**
 * Normalizes a point represented in projective coordinates.
 *
 * @param r			- the result.
 * @param p			- the point to normalize.
 */
static void eb_norm_super(eb_t r, const eb_t p, int flag) {
	if (!p->norm) {
		if (flag) {
			fb_copy(r->z, p->z);
		} else {
			fb_inv(r->z, p->z);
		}
		fb_mul(r->x, p->x, r->z);
		fb_mul(r->y, p->y, r->z);
		fb_set_dig(r->z, 1);
	}

	r->norm = 1;
}
Пример #7
0
/**
 * Precomputes the square root of z.
 */
static void find_srz() {
	int i;

	fb_set_dig(fb_srz, 2);

	for (i = 1; i < FB_BITS; i++) {
		fb_sqr(fb_srz, fb_srz);
	}

#ifdef FB_PRECO
	for (i = 0; i <= 255; i++) {
		fb_mul_dig(fb_tab_srz[i], fb_srz, i);
	}
#endif
}
Пример #8
0
/**
 * Precomputes the square root of z.
 */
static void find_srz() {
	ctx_t *ctx = core_get();

	fb_set_dig(ctx->fb_srz, 2);

	for (int i = 1; i < FB_BITS; i++) {
		fb_sqr(ctx->fb_srz, ctx->fb_srz);
	}

#ifdef FB_PRECO
	for (int i = 0; i <= 255; i++) {
		fb_mul_dig(ctx->fb_tab_srz[i], ctx->fb_srz, i);
	}
#endif
}
Пример #9
0
/**
 * Normalizes a point represented in projective coordinates.
 *
 * @param[out] r		- the result.
 * @param[in] p			- the point to normalize.
 * @param[in] flag		- if the Z coordinate is already inverted.
 */
static void eb_norm_ordin(eb_t r, eb_t p, int flag) {
	if (!p->norm) {
		if (flag) {
			fb_copy(r->z, p->z);
		} else {
			fb_inv(r->z, p->z);
		}
		fb_mul(r->x, p->x, r->z);
		fb_sqr(r->z, r->z);
		fb_mul(r->y, p->y, r->z);
		fb_set_dig(r->z, 1);
	}

	r->norm = 1;
}
Пример #10
0
void eb_read_bin(eb_t a, const uint8_t *bin, int len) {
	if (len == 1) {
		if (bin[0] == 0) {
			eb_set_infty(a);
			return;
		} else {
			THROW(ERR_NO_BUFFER);
			return;
		}
	}

	if (len != (FB_BYTES + 1) && len != (2 * FB_BYTES + 1)) {
		THROW(ERR_NO_BUFFER);
		return;
	}

	a->norm = 1;
	fb_set_dig(a->z, 1);
	fb_read_bin(a->x, bin + 1, FB_BYTES);
	if (len == FB_BYTES + 1) {
		switch(bin[0]) {
			case 2:
				fb_zero(a->y);
				break;
			case 3:
				fb_zero(a->y);
				fb_set_bit(a->y, 0, 1);
				break;
			default:
				THROW(ERR_NO_VALID);
				break;
		}
		eb_upk(a, a);
	}

	if (len == 2 * FB_BYTES + 1) {
		if (bin[0] == 4) {
			fb_read_bin(a->y, bin + FB_BYTES + 1, FB_BYTES);
		} else {
			THROW(ERR_NO_VALID);
		}
	}
}
Пример #11
0
void eb_curve_set_kbltz(fb_t a, eb_t g, bn_t r, bn_t h) {
	curve_is_kbltz = 1;
	curve_is_super = 0;

	fb_copy(curve_a, a);
	fb_set_dig(curve_b, 1);

	detect_opt(&curve_opt_a, curve_a);
	detect_opt(&curve_opt_b, curve_b);

#if EB_MUL == LWNAF || EB_FIX == LWNAF || EB_SIM == INTER || !defined(STRIP)
	compute_kbltz();
#endif
	eb_norm(g, g);
	eb_copy(&curve_g, g);
	bn_copy(&curve_r, r);
	bn_copy(&curve_h, h);
#if defined(EB_PRECO)
	eb_mul_pre(eb_curve_get_tab(), &curve_g);
#endif
}
Пример #12
0
void eb_curve_set_kbltz(const fb_t a, const eb_t g, const bn_t r, const bn_t h) {
	ctx_t *ctx = core_get();

	ctx->eb_is_kbltz = 1;
	ctx->eb_is_super = 0;

	fb_copy(ctx->eb_a, a);
	fb_set_dig(ctx->eb_b, 1);

	detect_opt(&(ctx->eb_opt_a), ctx->eb_a);
	detect_opt(&(ctx->eb_opt_b), ctx->eb_b);

#if EB_MUL == LWNAF || EB_FIX == LWNAF || EB_SIM == INTER || !defined(STRIP)
	compute_kbltz();
#endif
	eb_norm(&(ctx->eb_g), g);
	bn_copy(&(ctx->eb_r), r);
	bn_copy(&(ctx->eb_h), h);
#if defined(EB_PRECO)
	eb_mul_pre((eb_t *)eb_curve_get_tab(), &(ctx->eb_g));
#endif
}
Пример #13
0
void eb_tab(eb_t *t, const eb_t p, int w) {
	int u;

#if defined(EB_PLAIN)
	if (!eb_curve_is_kbltz()) {
		if (w > 2) {
			eb_dbl(t[0], p);
#if defined(EB_MIXED)
			eb_norm(t[0], t[0]);
#endif
			eb_add(t[1], t[0], p);
			for (int i = 2; i < (1 << (w - 2)); i++) {
				eb_add(t[i], t[i - 1], t[0]);
			}
#if defined(EB_MIXED)
			eb_norm_sim(t + 1, (const eb_t *)t + 1, (1 << (w - 2)) - 1);
#endif
		}
		eb_copy(t[0], p);
	}
#endif /* EB_PLAIN */

#if defined(EB_KBLTZ)
	if (eb_curve_is_kbltz()) {
		u = (eb_curve_opt_a() == OPT_ZERO ? -1 : 1);

		/* Prepare the precomputation table. */
		for (int i = 0; i < 1 << (w - 2); i++) {
			eb_set_infty(t[i]);
			fb_set_dig(t[i]->z, 1);
			t[i]->norm = 1;
		}

#if defined(EB_MIXED)
		eb_norm(t[0], p);
#else
		eb_copy(t[0], p);
#endif

		switch (w) {
#if EB_DEPTH == 3 || EB_WIDTH ==  3
			case 3:
				eb_frb(t[1], t[0]);
				if (u == 1) {
					eb_sub(t[1], t[0], t[1]);
				} else {
					eb_add(t[1], t[0], t[1]);
				}
				break;
#endif
#if EB_DEPTH == 4 || EB_WIDTH ==  4
			case 4:
				eb_frb(t[3], t[0]);
				eb_frb(t[3], t[3]);

				eb_sub(t[1], t[3], p);
				eb_add(t[2], t[3], p);
				eb_frb(t[3], t[3]);

				if (u == 1) {
					eb_neg(t[3], t[3]);
				}
				eb_sub(t[3], t[3], p);
				break;
#endif
#if EB_DEPTH == 5 || EB_WIDTH ==  5
			case 5:
				eb_frb(t[3], t[0]);
				eb_frb(t[3], t[3]);

				eb_sub(t[1], t[3], p);
				eb_add(t[2], t[3], p);
				eb_frb(t[3], t[3]);

				eb_frb(t[7], t[3]);
				eb_sub(t[7], t[7], p);

				if (u == 1) {
					eb_neg(t[3], t[3]);
				}
				eb_sub(t[3], t[3], p);

				eb_frb(t[4], t[2]);
				eb_frb(t[4], t[4]);

				eb_neg(t[4], t[4]);
				eb_sub(t[5], t[4], p);
				eb_add(t[6], t[4], p);

				eb_frb(t[4], t[4]);
				if (u == -1) {
					eb_neg(t[4], t[4]);
				}
				eb_add(t[4], t[4], p);
				break;
#endif
#if EB_DEPTH == 6 || EB_WIDTH ==  6
			case 6:
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				eb_neg(t[14], t[0]);

				eb_sub(t[13], t[14], p);
				eb_add(t[14], t[14], p);

				eb_frb(t[0], t[0]);
				eb_frb(t[8], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[11], t[0], p);
				eb_add(t[12], t[0], p);

				eb_frb(t[0], t[12]);
				eb_frb(t[0], t[0]);
				eb_sub(t[1], t[0], p);
				eb_add(t[2], t[0], p);

				eb_frb(t[15], t[8]);
				if (u == -1) {
					eb_neg(t[15], t[15]);
				}
				eb_sub(t[15], t[15], p);

				eb_frb(t[0], t[13]);
				eb_frb(t[0], t[0]);
				eb_sub(t[5], t[0], p);
				eb_add(t[6], t[0], p);

				eb_sub(t[7], t[8], p);
				eb_add(t[8], t[8], p);

				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[3], t[0], p);
				eb_add(t[4], t[0], p);

				eb_frb(t[0], t[1]);
				eb_frb(t[0], t[0]);

				eb_neg(t[9], t[0]);
				eb_sub(t[9], t[9], p);

				eb_frb(t[0], t[14]);
				eb_frb(t[0], t[0]);
				eb_add(t[10], t[0], p);

				eb_copy(t[0], p);
				break;
#endif
#if EB_DEPTH == 7 || EB_WIDTH ==  7
			/**
			 * Formulas from http://eprint.iacr.org/2012/519
			 */
			case 7:
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				eb_sub(t[17], t[0], p);
				eb_add(t[18], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == 1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[19], t[0], p);
				eb_add(t[20], t[0], p);

				eb_frb(t[0], t[19]);
				eb_frb(t[0], t[0]);
				eb_frb(t[11], t[0]);
				if (u == 1) {
					eb_neg(t[11], t[11]);
				}
				eb_add(t[12], t[11], p);
				eb_sub(t[11], t[11], p);
				eb_neg(t[0], t[0]);
				eb_sub(t[1], t[0], p);
				eb_add(t[2], t[0], p);

				eb_frb(t[0], t[17]);
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[3], t[0], p);

				eb_frb(t[0], t[1]);
				eb_frb(t[0], t[0]);
				eb_add(t[9], t[0], p);
				eb_neg(t[9], t[9]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_add(t[4], t[0], p);

				eb_frb(t[0], t[18]);
				eb_frb(t[0], t[0]);
				eb_sub(t[7], t[0], t[18]);
				eb_sub(t[25], t[0], p);
				eb_add(t[26], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[27], t[0], p);
				eb_add(t[28], t[0], p);

				eb_frb(t[0], t[17]);
				eb_frb(t[0], t[0]);
				eb_add(t[8], t[0], t[18]);
				eb_neg(t[0], t[0]);
				eb_add(t[10], t[0], p);

				eb_frb(t[0], t[7]);
				eb_frb(t[0], t[0]);
				eb_sub(t[13], t[0], p);
				eb_frb(t[0], t[8]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_add(t[14], t[0], p);

				eb_frb(t[0], t[19]);
				eb_frb(t[0], t[0]);
				eb_add(t[15], t[0], t[17]);
				eb_add(t[16], t[0], t[18]);

				eb_frb(t[0], t[26]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[5], t[0], p);
				eb_add(t[6], t[0], p);
				eb_add(t[23], t[0], t[17]);
				eb_add(t[24], t[0], t[18]);

				eb_frb(t[0], t[25]);
				eb_frb(t[0], t[0]);
				eb_sub(t[21], t[0], p);
				eb_add(t[22], t[0], p);

				eb_frb(t[0], t[20]);
				eb_frb(t[0], t[0]);
				eb_add(t[29], t[0], p);
				eb_neg(t[29], t[29]);

				eb_frb(t[0], t[27]);
				eb_frb(t[0], t[0]);
				eb_add(t[30], t[0], p);

				eb_frb(t[0], t[7]);
				eb_frb(t[0], t[0]);
				eb_add(t[31], t[0], t[17])

						eb_copy(t[0], p);
				break;
#endif
#if EB_DEPTH == 8 || EB_WIDTH ==  8
			/**
			 * Formulas from http://eprint.iacr.org/2012/519
			 */
			case 8:
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[45], t[0], p);
				eb_add(t[46], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == 1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[43], t[0], p);
				eb_add(t[44], t[0], p);

				eb_frb(t[0], t[44]);
				eb_frb(t[0], t[0]);
				eb_sub(t[1], t[0], p);
				eb_add(t[2], t[0], p);
				eb_add(t[47], t[0], t[45]);
				eb_add(t[48], t[0], t[46]);

				eb_frb(t[0], t[46]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[7], t[0], t[46]);
				eb_sub(t[8], t[0], t[45]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[3], t[0], p);

				eb_frb(t[0], t[1]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_add(t[55], t[0], t[45]);
				eb_add(t[56], t[0], t[46]);
				eb_sub(t[9], t[0], p);
				eb_add(t[10], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == 1) {
					eb_neg(t[0], t[0]);
				}
				eb_add(t[4], t[0], p);

				eb_frb(t[0], t[47]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[17], t[0], p);
				eb_add(t[18], t[0], p);

				eb_frb(t[0], t[8]);
				eb_frb(t[0], t[0]);
				eb_add(t[31], t[0], t[45]);
				eb_add(t[32], t[0], t[46]);
				eb_neg(t[0], t[0]);
				eb_sub(t[13], t[0], p);
				eb_add(t[14], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[19], t[0], p);

				eb_frb(t[0], t[7]);
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_add(t[20], t[0], p);

				eb_frb(t[0], t[9]);
				eb_frb(t[0], t[0]);
				eb_sub(t[21], t[0], p);
				eb_add(t[22], t[0], p);

				eb_frb(t[0], t[2]);
				eb_frb(t[0], t[0]);
				eb_sub(t[25], t[0], p);
				eb_add(t[26], t[0], p);

				eb_frb(t[0], t[43]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[33], t[0], p);
				eb_add(t[34], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_add(t[12], t[0], p);

				eb_frb(t[0], t[45]);
				eb_frb(t[0], t[0]);
				eb_sub(t[37], t[0], p);
				eb_add(t[38], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[35], t[0], p);
				eb_add(t[36], t[0], p);

				eb_frb(t[0], t[38]);
				eb_frb(t[0], t[0]);
				eb_sub(t[41], t[0], p);
				eb_add(t[42], t[0], p);
				eb_neg(t[0], t[0]);
				eb_sub(t[39], t[0], t[46]);
				eb_sub(t[40], t[0], t[45]);

				eb_frb(t[0], t[37]);
				eb_frb(t[0], t[0]);
				eb_sub(t[5], t[0], p);
				eb_add(t[6], t[0], p);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_add(t[15], t[0], t[43]);
				eb_add(t[16], t[0], t[44]);
				eb_neg(t[0], t[0]);
				eb_sub(t[27], t[0], p);
				eb_add(t[28], t[0], p);

				eb_frb(t[0], t[36]);
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[11], t[0], p);

				eb_frb(t[0], t[39]);
				eb_frb(t[0], t[0]);
				eb_add(t[0], t[0], p);
				eb_neg(t[49], t[0]);

				eb_frb(t[0], t[7]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_add(t[50], t[0], p);

				eb_frb(t[0], t[44]);
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				if (u == 1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[51], t[0], p);
				eb_add(t[52], t[0], p);

				eb_frb(t[0], t[46]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[53], t[0], p);
				eb_add(t[54], t[0], p);

				eb_frb(t[0], t[54]);
				eb_frb(t[0], t[0]);
				eb_add(t[23], t[0], t[45]);
				eb_add(t[24], t[0], t[46]);

				eb_frb(t[0], t[42]);
				eb_frb(t[0], t[0]);
				eb_sub(t[57], t[0], p);

				eb_frb(t[0], t[53]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_add(t[58], t[0], p);

				eb_frb(t[0], t[38]);
				eb_frb(t[0], t[0]);
				eb_frb(t[0], t[0]);
				if (u == -1) {
					eb_neg(t[0], t[0]);
				}
				eb_sub(t[59], t[0], p);
				eb_add(t[60], t[0], p);

				eb_frb(t[0], t[35]);
				eb_frb(t[0], t[0]);
				eb_sub(t[61], t[0], p);
				eb_add(t[62], t[0], p);

				eb_frb(t[0], t[47]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_add(t[63], t[0], t[45]);

				eb_frb(t[0], t[36]);
				eb_frb(t[0], t[0]);
				eb_neg(t[0], t[0]);
				eb_sub(t[29], t[0], p);
				eb_add(t[30], t[0], p);

				eb_copy(t[0], p);
				break;
#endif
		}
#if defined(EB_MIXED)
		if (w > 2) {
			eb_norm_sim(t + 1, (const eb_t *)t + 1, (1 << (w - 2)) - 1);
		}
#endif
	}
#endif /* EB_KBLTZ */
}