コード例 #1
0
/**
 * Finds an addition chain for (FB_BITS - 1).
 */
static void find_chain() {
	int i, j, k, l;

	chain_len = -1;
	for (i = 0; i < MAX_CHAIN; i++) {
		chain[i] = (i << 8) + i;
	}
	switch (FB_BITS) {
		case 193:
			chain[1] = (1 << 8) + 0;
			chain_len = 8;
			break;
		case 233:
			chain[1] = (1 << 8) + 0;
			chain[3] = (3 << 8) + 0;
			chain[6] = (6 << 8) + 0;
			chain_len = 10;
			break;
		case 251:
			chain[1] = (1 << 8) + 0;
			chain[2] = (2 << 8) + 1;
			chain[4] = (4 << 8) + 3;
			chain[5] = (5 << 8) + 4;
			chain[7] = (7 << 8) + 6;
			chain[8] = (8 << 8) + 7;
			chain_len = 10;
			break;
		case 353:
			chain[2] = (2 << 8) + 0;
			chain[4] = (4 << 8) + 0;
			chain_len = 10;
			break;
		case 1223:
			chain[1] = (1 << 8) + 0;
			chain[2] = (2 << 8) + 0;
			chain[4] = (4 << 8) + 2;
			chain[5] = (5 << 8) + 4;
			chain[10] = (10 << 8) + 2;
			chain[11] = (11 << 8) + 10;
			chain_len = 13;
			break;
		default:
			l = 0;
			j = (FB_BITS - 1);
			for (k = 16; k >= 0; k--) {
				if (j & (1 << k)) {
					break;
				}
			}
			for (i = 1; i < k; i++) {
				if (j & (1 << i)) {
					l++;
				}
			}
			i = 0;
			chain_len = k + l;
			while (j != 1) {
				if ((j & 0x01) != 0) {
					i++;
					chain[chain_len - i] = ((chain_len - i) << 8) + 0;
				}
				i++;
				j = j >> 1;
			}
			break;
	}

#ifdef FB_PRECO
	int x, y, u[chain_len + 1];

	u[0] = 1;
	u[1] = 2;
	for (i = 2; i <= chain_len; i++) {
		x = chain[i - 1] >> 8;
		y = chain[i - 1] - (x << 8);
		if (x == y) {
			u[i] = 2 * u[i - 1];
		} else {
			u[i] = u[x] + u[y];
		}
	}

	for (i = 0; i <= chain_len; i++) {
		fb_itr_pre(fb_poly_tab_sqr(i), u[i]);
	}

#endif

}
コード例 #2
0
ファイル: relic_fb_poly.c プロジェクト: Arash-Afshar/relic
/**
 * Finds an addition chain for (FB_BITS - 1).
 */
static void find_chain() {
	int i, j, k, l;
	ctx_t *ctx = core_get();

	ctx->chain_len = -1;
	for (int i = 0; i < MAX_TERMS; i++) {
		ctx->chain[i] = (i << 8) + i;
	}
	switch (FB_BITS) {
		case 127:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain[4] = (4 << 8) + 2;
			ctx->chain[7] = (7 << 8) + 2;
			ctx->chain_len = 9;
			break;
		case 193:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain_len = 8;
			break;
		case 233:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain[3] = (3 << 8) + 0;
			ctx->chain[6] = (6 << 8) + 0;
			ctx->chain_len = 10;
			break;
		case 251:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain[2] = (2 << 8) + 1;
			ctx->chain[4] = (4 << 8) + 3;
			ctx->chain[5] = (5 << 8) + 4;
			ctx->chain[7] = (7 << 8) + 6;
			ctx->chain[8] = (8 << 8) + 7;
			ctx->chain_len = 10;
			break;
		case 283:
			ctx->chain[4] = (4 << 8) + 0;
			ctx->chain[6] = (6 << 8) + 0;
			ctx->chain[9] = (9 << 8) + 0;
			ctx->chain_len = 11;
			break;
		case 353:
			ctx->chain[2] = (2 << 8) + 0;
			ctx->chain[4] = (4 << 8) + 0;
			ctx->chain_len = 10;
			break;
		case 367:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain[2] = (2 << 8) + 1;
			ctx->chain[6] = (6 << 8) + 3;
			ctx->chain[9] = (9 << 8) + 2;
			ctx->chain_len = 11;
			break;
		case 1223:
			ctx->chain[1] = (1 << 8) + 0;
			ctx->chain[2] = (2 << 8) + 0;
			ctx->chain[4] = (4 << 8) + 2;
			ctx->chain[5] = (5 << 8) + 4;
			ctx->chain[10] = (10 << 8) + 2;
			ctx->chain[11] = (11 << 8) + 10;
			ctx->chain_len = 13;
			break;
		default:
			l = 0;
			j = (FB_BITS - 1);
			for (k = 16; k >= 0; k--) {
				if (j & (1 << k)) {
					break;
				}
			}
			for (i = 1; i < k; i++) {
				if (j & (1 << i)) {
					l++;
				}
			}
			i = 0;
			ctx->chain_len = k + l;
			while (j != 1) {
				if ((j & 0x01) != 0) {
					i++;
					ctx->chain[ctx->chain_len - i] = ((ctx->chain_len - i) << 8) + 0;
				}
				i++;
				j = j >> 1;
			}
			break;
	}

	int x, y, u[ctx->chain_len + 1];

	for (i = 0; i < MAX_TERMS; i++) {
		for (j = 0; j < FB_TABLE; j++) {
			ctx->fb_tab_ptr[i][j] = &(ctx->fb_tab_sqr[i][j]);
		}
	}

	u[0] = 1;
	u[1] = 2;
	for (i = 2; i <= ctx->chain_len; i++) {
		x = ctx->chain[i - 1] >> 8;
		y = ctx->chain[i - 1] - (x << 8);
		if (x == y) {
			u[i] = 2 * u[i - 1];
		} else {
			u[i] = u[x] + u[y];
		}
	}

	for (i = 0; i <= ctx->chain_len; i++) {
		fb_itr_pre((fb_t *)fb_poly_tab_sqr(i), u[i]);
	}
}