X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/1589affab225db500965e2cb869c534d6860e6bd..4edc47b89bc56cd4041fdb0f4e8e892acd589ed8:/ec-gentab.awk diff --git a/ec-gentab.awk b/ec-gentab.awk new file mode 100755 index 0000000..b00300c --- /dev/null +++ b/ec-gentab.awk @@ -0,0 +1,116 @@ +#! /usr/bin/awk -f +# +# $Id: ec-gentab.awk,v 1.1 2004/04/01 21:28:41 mdw Exp $ + +function banner(name, s, i) +{ + s = "/*----- " name " "; + while (length(s) < 75) s = s "-"; + return (s "*/"); +} + +function fix(name) +{ + gsub(/[^0-9A-Za-z_]+/, "_", name); + return (name); +} + +BEGIN { + print "/* -*-c-*-"; + print " *"; + print " * Table of elliptic curves [generated]"; + print " */"; + print ""; + print "#include \"ectab.h\""; + print ""; + print "#define N(x) (sizeof(x)/sizeof(*x))"; + print "#define MP(x) { x, x + N(x), N(x), 0, MP_CONST, 0 }"; + print "#define NOMP { 0, 0, 0, 0, 0 }"; + print ""; + print banner("Curve data"); + print ""; + + d_i = 0; + name = ""; +} + +function putmp(x, d) +{ + if (!(x in data)) { + print "curve " name ": missing " x >"/dev/stderr"; + exit 1; + } + d = data[x]; + if (!(d in cache)) { + n = "c_" fix(name) "_" x; + print "static mpw " n "[] = {"; + system("./mpdump " d); + print "};"; + print ""; + cache[d] = n; + } + mp[x] = cache[d]; +} + +function flush() +{ + if (name == "") return; + print "/* --- Curve " name " --- */"; + delete mp; + print ""; + putmp("p"); + if (type == "binnorm") putmp("beta"); + putmp("a"); + putmp("b"); + putmp("r"); + putmp("h"); + putmp("gx"); + putmp("gy"); + print "static ecdata c_" fix(name) " = {"; + print " FTAG_" toupper(type) ","; + print " MP(" mp["p"] ")," + if (type == "binnorm") + print " MP(" mp["beta"] "),"; + else + print " NOMP,"; + print " MP(" mp["a"] ")," + print " MP(" mp["b"] ")," + print " MP(" mp["r"] ")," + print " MP(" mp["h"] ")," + print " MP(" mp["gx"] ")," + print " MP(" mp["gy"] ")" + print "};"; + print ""; + dname[d_i++] = name; + d[name] = name; + r[name] = "c_" fix(name); + name = ""; +} + +/^[ \t]*(#|$)/ { next; } + +$1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; } + +$1 == "curve" { flush(); delete data; name = $2; type = $3; next; } + +{ data[$1] = $2; next; } + +END { + flush(); + print banner("Main table"); + print ""; + print "const ecentry ectab[] = {"; + for (i = 0; i < d_i; i++) { + name = dname[i]; + rname = d[name]; + if (!rname in r) { + print "curve " rname " not found (alias from " name ")" >"/dev/stderr"; + exit 1; + } + print " { \"" name "\", &" r[rname] " },"; + } + print " { 0, 0 }"; + print "};" + print ""; + print banner("That's all, folks"); +}