19 const usage = `usage: ./epoint-client [k|d|s|v] [args..] < [seed|document]
20 server is http://localhost:8080 by default
22 k - make key, use seed for generation, args: [issuer] denomination
23 d - make draft, use seed as signing key, args: targetid value
24 s - submit a document, args: k[ey]|d[raft]|c[ert] [server]
25 v - verify a document (prints body of the document if ok)
28 func rnd(n int) (r []byte, err error) {
30 _, err = io.ReadFull(rand.Reader, r)
34 func k(r []byte, issuer, denom string) (err error) {
38 e, err = key.Issuer(r, denom)
40 e, err = key.Holder(r, issuer, denom)
45 w, err := armor.Encode(os.Stdout, openpgp.PublicKeyType, nil)
49 // TODO: maybe Serialize should do this internally
50 for _, ident := range e.Identities {
51 err = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey)
56 for _, subkey := range e.Subkeys {
57 err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey)
71 _, err = os.Stdout.Write([]byte{'\n'})
75 func d(r []byte, target, value string) (err error) {
76 v, err := strconv.Atoi64(value)
80 e, err := key.Holder(r, "", "")
84 draft := new(document.Draft)
85 draft.Drawer = key.Id(e)
86 draft.Beneficiary = target
88 draft.Denomination = "" // TODO
89 draft.Issuer = "" // TODO
90 draft.AuthorizedBy = "" // TODO
95 draft.Nonce = fmt.Sprintf("%X", nonce)
96 s, _, err := document.Format(draft, e)
100 _, err = os.Stdout.Write(s)
104 func s(d []byte, cmd, server string) (err error) {
105 m := map[string]string{
112 err = fmt.Errorf("unknown submit command: %s", cmd)
115 resp, err := http.PostForm(server, url.Values{k: {string(d)}})
119 if resp.StatusCode != 200 {
120 log.Printf("request failed: %s\n", resp.Status)
122 _, err = io.Copy(os.Stdout, resp.Body)
126 err = resp.Body.Close()
130 func v(d []byte) (err error) {
131 // handle armored pubkey
132 if bytes.Index(d, []byte(openpgp.PublicKeyType)) >= 0 {
133 es, err1 := openpgp.ReadArmoredKeyRing(bytes.NewBuffer(d))
138 for _, e := range es {
139 isIssuer, issuer, denom, err1 := key.Check(e)
148 fmt.Println("Issuer key")
150 fmt.Println("Holder key")
152 fmt.Printf("Issuer: %s\nDenomination: %s\nId: %s\n", issuer, denom, key.Id(e))
156 _, s, err := document.Parse(d)
160 _, err = os.Stdout.Write(s.Body)
165 b := make([]byte, 10000)
166 n, err := io.ReadFull(os.Stdin, b)
167 if err != io.ErrUnexpectedEOF {
169 log.Fatal("too much input")
177 if len(os.Args) < 2 {
186 if len(os.Args) == 4 {
189 } else if len(os.Args) == 3 {
194 err = k(read(), issuer, denom)
196 if len(os.Args) != 4 {
199 err = d(read(), os.Args[2], os.Args[3])
201 server := "http://localhost:8080"
203 if len(os.Args) == 4 {
206 } else if len(os.Args) == 3 {
211 err = s(read(), cmd, server+"/submit")
213 if len(os.Args) != 2 {