implement Sign; include "sys.m"; sys: Sys; sprint: import sys; include "draw.m"; include "keyring.m"; keyring: Keyring; DigestState, PK: import keyring; Sign: module { init: fn(nil: ref Draw->Context, args: list of string); }; Metafilesizemax: con 8*1024; hash := "sha1"; # usage: sign_test [hashname] < secretkey init(nil: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; keyring = load Keyring Keyring->PATH; if(len argv > 1) hash = hd tl argv; (skd, err) := readstdin(Metafilesizemax); if(err != nil) { } else { sk := keyring->strtosk(string skd); if(sk == nil) { warn("malformed secret key"); } else { bytes := array of byte "some data"; dstate := keyring->sha1(bytes, len bytes, nil, nil); if(dstate == nil) { warn("failed to make digest"); } else { exp := 1258801674; # long time in the future cert := keyring->sign(sk, exp, dstate, hash); if(cert == nil) warn("did not make certificate"); else sys->print("%s", keyring->certtostr(cert)); } } } } readstdin(maxsize: int): (array of byte, string) { n := sys->readn(sys->fildes(0), d := array[maxsize] of byte, len d); if(n < 0) return (nil, sprint("read stdin %r")); if(n == len d) return (nil, sprint("file stdin too large")); return (d[:n], nil); } warn(s: string) { sys->fprint(sys->fildes(2), "%s\n", s); }