X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/ba6e6b64033b1f9de49feccb5c9cd438354481f7..0f00dc4c8eb47e67bc0f148c2dd109f73a451e0a:/keysz-conv.c diff --git a/keysz-conv.c b/keysz-conv.c deleted file mode 100644 index 2d40558..0000000 --- a/keysz-conv.c +++ /dev/null @@ -1,179 +0,0 @@ -/* -*-c-*- - * - * Key length conversions - * - * (c) 2007 Straylight/Edgeware - */ - -/*----- Licensing notice --------------------------------------------------* - * - * This file is part of Catacomb. - * - * Catacomb is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * Catacomb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with Catacomb; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. - */ - -/*----- Header files ------------------------------------------------------*/ - -#include - -#include "keysz.h" - -/*----- Main code ---------------------------------------------------------*/ - -/* --- Primitive conversions --- */ - -static double fromnfs(double nbits) -{ - /* --- Magic taken from P1363 --- */ -#define LOG2 0.6931471805599453094172321214581765680755 -#define MAGIC 8.567936 /* = 17.135872 / 2 */ - double z = log(nbits * LOG2)/LOG2; - return 4.0/3.0 * pow(3 * nbits * z*z, 1.0/3.0) - MAGIC; -} - -static double tonfs(double nbits) -{ - double hi, lo, mid, val; - - /* --- Find upper and lower bounds --- */ - - for (hi = nbits; fromnfs(hi) < nbits; hi *= 2); - for (lo = nbits; fromnfs(lo) > nbits; lo /= 2); - - /* --- Bisect the interval until we get an answer --- */ - -#define THRESH 0.01 - for (;;) { - mid = (hi + lo)/2; - val = fromnfs(mid); - if (fabs(val - nbits) < THRESH) - return (mid); - else if (val < nbits) - lo = mid; - else - hi = mid; - } -} - -static double torho(double nbits) { return 2*nbits; } -static double fromrho(double nbits) { return nbits/2; } - -/* --- @keysz_fromdl@, @_fromschnorr@, @_fromif@, @_fromec@ --- * - * - * Arguments: @double nbits@ = key size - * - * Returns: Equivalent symmetric key size. - * - * Use: Converts key lengths of various kinds of reference problems - * to (roughly) equivalent symmetric key sizes. - * - * * Given the bit length of %$p$%, @keysz_fromdl@ returns a - * key size representing the difficulty of computing - * discrete logarithms in %$\gf{p}$%, for %$p$% prime or a - * small power of a prime. - * - * * Given the bit length of %$r$%, @keysz_fromschnorr@ - * returns a key size representing the difficulty of - * computing discrete logarithms in a subgroup of %$\gf{q}$% - * of order %$r$%. - * - * * Given the bit length of %$n$%, @keysz_fromif@ returns a - * key size representing the difficulty of factoring a - * `hard' number %$n = p q$%, where %$p$% and %$q$% are - * primes of (near enough) the same length. - * - * * Given the bit length of %$r$%, @keysz_fromec@ returns a - * key size representing the difficulty of computing - * discrete logarithms in a subgroup of order-%$r$% of an - * elliptic curve over a finite field. - * - * These functions take and return @double@ rather than an - * integer type in order to preserve precision between - * conversions. - */ - -#define CONVERSIONS(_) \ - _(dl, nfs) \ - _(schnorr, rho) \ - _(if, nfs) \ - _(ec, rho) - -#define DEFINE_FROM(what, how) \ - double keysz_from##what(double nbits) { return from##how(nbits); } - -CONVERSIONS(DEFINE_FROM) - -/* --- @keysz_todl@, @_toschnorr@, @_toif@, @_toec@ --- * - * - * Arguments: @unsigned long nbits@ = symmetric key size - * - * Returns: Equivalent key size. - * - * Use: Converts symmetric key sizes to (roughly) equivalent key - * sizes for various kinds of reference problems. These are the - * approximate inverses of the functions above. - */ - -#define DEFINE_TO(what, how) \ - double keysz_to##what(double nbits) { return to##how(nbits); } - -CONVERSIONS(DEFINE_TO) - -/*----- Interactive mode for testing --------------------------------------*/ - -#ifdef TEST_RIG - -#include -#include -#include - -static const struct entry { - const char *name; - double (*func)(double); -} tab[] = { -#define ENTRY_FROM(what, how) { "from" #what, keysz_from##what }, -#define ENTRY_TO(what, how) { "to" #what, keysz_to##what }, - CONVERSIONS(ENTRY_FROM) - CONVERSIONS(ENTRY_TO) - { 0 } -}; - -int main(int argc, char *argv[]) -{ - const struct entry *e; - double d; - - if (!argv[1]) { - fprintf(stderr, "conversions:"); - for (e = tab; e->name; e++) fprintf(stderr, " %s", e->name); - putc('\n', stderr); - return (1); - } - for (e = tab; e->name && strcmp(e->name, argv[1]); e++); - if (!e) { - fprintf(stderr, "unknown conversion `%s'\n", argv[1]); - return (1); - } - for (argv += 2; *argv; argv++) { - d = strtod(*argv, 0); - printf("%s(%g) = %g\n", e->name, d, e->func(d)); - } - return (0); -} - -#endif - -/*----- That's all, folks -------------------------------------------------*/