diff options
| author | J08nY | 2017-12-17 02:17:33 +0100 |
|---|---|---|
| committer | J08nY | 2017-12-17 02:17:33 +0100 |
| commit | e9b54225b7258189862baa879af7466aa125742b (patch) | |
| tree | 6030e62f88e57fca203cf24c378edf5fd3eacd5b /src/gen | |
| parent | 44371b75436094aa360e2123191da9cbb9c61fda (diff) | |
| download | ecgen-e9b54225b7258189862baa879af7466aa125742b.tar.gz ecgen-e9b54225b7258189862baa879af7466aa125742b.tar.zst ecgen-e9b54225b7258189862baa879af7466aa125742b.zip | |
Fix some errors in brainpool rfc generation (4/7 RFC curves pass).
Diffstat (limited to 'src/gen')
| -rw-r--r-- | src/gen/gens.c | 22 | ||||
| -rw-r--r-- | src/gen/gens.h | 13 |
2 files changed, 26 insertions, 9 deletions
diff --git a/src/gen/gens.c b/src/gen/gens.c index 2cffbc4..e2c624e 100644 --- a/src/gen/gens.c +++ b/src/gen/gens.c @@ -40,16 +40,25 @@ GENERATOR(gens_gen_one) { CHECK(gens_check_anomalous) { if (cfg->field == FIELD_BINARY) return 1; - pari_sp ltop = avma; for (size_t i = 0; i < curve->ngens; ++i) { if (mpcmp(curve->field, curve->generators[i]->order) == 0) { - avma = ltop; return -5; } } return 1; } +GEN gens_get_embedding(GEN prime, GEN order) { + pari_sp ltop = avma; + GEN power = gen_1; + GEN pm; + do { + power = mulii(power, prime); + pm = subii(power, gen_1); + } while (!dvdii(pm, order)); + return gerepilecopy(ltop, power); +} + CHECK(gens_check_embedding) { HAS_ARG(args); if (cfg->field == FIELD_BINARY) return 1; @@ -59,13 +68,8 @@ CHECK(gens_check_embedding) { GEN mind = strtoi(min_degree); for (size_t i = 0; i < curve->ngens; ++i) { - GEN power = gen_0; - GEN pm; - do { - power = addii(power, gen_1); - GEN ppow = powii(curve->field, power); - pm = subii(ppow, gen_1); - } while (!dvdii(pm, curve->generators[i]->order)); + GEN power = + gens_get_embedding(curve->field, curve->generators[i]->order); if (mpcmp(power, mind) <= 0) { avma = ltop; diff --git a/src/gen/gens.h b/src/gen/gens.h index 18c9815..11b349b 100644 --- a/src/gen/gens.h +++ b/src/gen/gens.h @@ -30,6 +30,7 @@ GENERATOR(gens_gen_any); GENERATOR(gens_gen_one); /** + * CHECK(check_f) * * @param curve * @param args @@ -39,6 +40,18 @@ GENERATOR(gens_gen_one); CHECK(gens_check_anomalous); /** + * @brief Get the embedding degree of a subgroup of <code>order</code> in a + * power of F_prime. + * + * @param prime The order of the base field. + * @param order The order of the subgroup generator (in the curve group). + * @return The embedding degree 't' such that <code>order</code> divides + * 'prime^t - 1'. + */ +GEN gens_get_embedding(GEN prime, GEN order); + +/** + * CHECK(check_f) * * @param curve * @param args |
