diff options
Diffstat (limited to 'appl/cmd/spki/verify.b')
| -rw-r--r-- | appl/cmd/spki/verify.b | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/appl/cmd/spki/verify.b b/appl/cmd/spki/verify.b new file mode 100644 index 00000000..9eab6b41 --- /dev/null +++ b/appl/cmd/spki/verify.b @@ -0,0 +1,107 @@ +implement Verify; + +# +# Copyright © 2004 Vita Nuova Holdings Limited +# + +# work in progress + +include "sys.m"; + sys: Sys; + +include "draw.m"; + +include "keyring.m"; + kr: Keyring; + IPint: import kr; + +include "bufio.m"; + bufio: Bufio; + Iobuf: import bufio; + +include "sexprs.m"; + sexprs: Sexprs; + Sexp: import sexprs; + +include "spki.m"; + spki: SPKI; + Hash, Key, Cert, Name, Subject, Signature, Seqel, Toplev, Valid: import spki; + dump: import spki; + + verifier: Verifier; + Speaksfor: import verifier; + +include "encoding.m"; + base64: Encoding; + +Verify: module +{ + init: fn(nil: ref Draw->Context, nil: list of string); +}; + +debug := 0; + +init(nil: ref Draw->Context, args: list of string) +{ + sys = load Sys Sys->PATH; + kr = load Keyring Keyring->PATH; + bufio = load Bufio Bufio->PATH; + sexprs = load Sexprs Sexprs->PATH; + spki = load SPKI SPKI->PATH; + verifier = load Verifier Verifier->PATH; + base64 = load Encoding Encoding->BASE64PATH; + + sexprs->init(); + spki->init(); + verifier->init(); + + f := bufio->fopen(sys->fildes(0), Sys->OREAD); + for(;;){ + (e, err) := Sexp.read(f); + if(e == nil && err == nil) + break; + if(err != nil) + error(sys->sprint("invalid s-expression: %s", err)); + (top, diag) := spki->parse(e); + if(diag != nil) + error(sys->sprint("invalid SPKI structure: %s", diag)); + pick t := top { + C => + if(debug) + sys->print("cert: %s\n", t.v.text()); + a := spki->hashexp(e, "md5"); + Sig => + sys->print("got signature %q\n", t.v.text()); + K => + sys->print("got key %q\n", t.v.text()); + Seq => + els := t.v; + if(debug){ + sys->print("(sequence"); + for(; els != nil; els = tl els) + sys->print(" %s", (hd els).text()); + sys->print(")"); + } + (claim, rem, whynot) := verifier->verify(t.v); + if(whynot != nil){ + if(rem == nil) + s := "end of sequence"; + else + s = (hd rem).text(); + sys->fprint(sys->fildes(2), "verify: failed to verify at %#q: %s\n", s, whynot); + }else{ + if(claim.regarding != nil) + scope := sys->sprint(" regarding %q", claim.regarding.text()); + sys->print("verified: %q speaks for %q%s\n", claim.subject.text(), claim.name.text(), scope); + } + * => + sys->print("unexpected SPKI type: %q\n", e.text()); + } + } +} + +error(s: string) +{ + sys->fprint(sys->fildes(2), "verify: %s\n", s); + raise "fail:error"; +} |
