implement Authcvt; include "sys.m"; sys: Sys; include "draw.m"; include "keyring.m"; keyring: Keyring; IPint: import keyring; SK, PK, Certificate, DigestState: import Keyring; include "sexprs.m"; sexprs: Sexprs; Sexp: import sexprs; Authcvt: module { init: fn(nil: ref Draw->Context, argv: list of string); }; init(nil: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; sexprs = load Sexprs Sexprs->PATH; sexprs->init(); keyring = load Keyring Keyring->PATH; if(len argv != 2) error("usage: authcvt keyfile"); ai := keyring->readauthinfo(hd tl argv); if(ai == nil) error(sys->sprint("cannot read %s: %r", hd tl argv)); for(r := "server" :: "client" :: nil; r != nil; r = tl r){ if(sys->print("key proto=infauth role=%s name=%s %q\n", hd r, ai.mypk.owner, "!authinfo="+authinfotostr(ai)) == -1) error(sys->sprint("add key failed: %r")); } } error(e: string) { sys->fprint(sys->fildes(2), "authcvt: %s\n", e); raise "fail:error"; } authinfotostr(ai: ref Keyring->Authinfo): string { return (ref Sexp.List( ss(keyring->pktostr(ai.spk)) :: ss(keyring->certtostr(ai.cert)) :: ss(keyring->sktostr(ai.mysk)) :: sd(ai.alpha.iptobytes()) :: sd(ai.p.iptobytes()) :: nil )).b64text(); } ss(s: string): ref Sexp.String { return ref Sexp.String(s, nil); } sd(d: array of byte): ref Sexp.Binary { return ref Sexp.Binary(d, nil); }