/** * 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 }
/** * 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]); } }