ref: 866d74c0c4bb50e85e9e8bb95140c10d409e53be
dir: /appl/cmd/auth/rsagen.b/
implement Rsagen;
include "sys.m";
sys: Sys;
include "draw.m";
include "ipints.m";
ipints: IPints;
IPint: import ipints;
include "crypt.m";
crypt: Crypt;
include "arg.m";
Rsagen: module
{
init: fn(nil: ref Draw->Context, nil: list of string);
};
init(nil: ref Draw->Context, args: list of string)
{
sys = load Sys Sys->PATH;
ipints = load IPints IPints->PATH;
crypt = load Crypt Crypt->PATH;
arg := load Arg Arg->PATH;
arg->init(args);
arg->setusage("auth/rsagen [-b bits] [-t 'attr=value attr=value ...']");
tag: string;
nbits := 1024;
while((o := arg->opt()) != 0)
case o {
'b' =>
nbits = int arg->earg();
if(nbits <= 0)
arg->usage();
if(nbits > 4096)
error("bits must be no greater than 4096");
't' =>
tag = arg->earg();
* =>
arg->usage();
}
args = arg->argv();
if(args != nil)
arg->usage();
arg = nil;
sk := crypt->rsagen(nbits, 6, 0);
if(sk == nil)
error("unable to generate key");
if(tag != nil)
tag = " "+tag;
s := add("ek", sk.pk.ek);
s += add("n", sk.pk.n);
s += add("!dk", sk.dk);
s += add("!p", sk.p);
s += add("!q", sk.q);
s += add("!kp", sk.kp);
s += add("!kq", sk.kq);
s += add("!c2", sk.c2);
a := sys->aprint("key proto=rsa%s size=%d%s\n", tag, sk.pk.n.bits(), s);
if(sys->write(sys->fildes(1), a, len a) != len a)
error(sys->sprint("error writing key: %r"));
}
error(s: string)
{
sys->fprint(sys->fildes(2), "rsagen: %s\n", s);
raise "fail:error";
}
add(name: string, b: ref IPint): string
{
return " "+name+"="+b.iptostr(16);
}