#! /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"); }