epoint-client: raw document signing (without dash escape)
authornsz <nsz@port70.net>
Sat, 7 Jan 2012 20:19:23 +0000 (21:19 +0100)
committernsz <nsz@port70.net>
Sat, 7 Jan 2012 20:19:23 +0000 (21:19 +0100)
cmd/epoint-client/epoint-client.go

index 8a129c6..2931bcb 100644 (file)
@@ -21,12 +21,13 @@ import (
 
 var db *store.Conn
 
-const usage = `usage: ./epoint-client [i|h|d|q|s|v|c] [args..] < [seed|document]
+const usage = `usage: ./epoint-client [i|h|d|r|q|s|v|c] [args..] < [seed|document]
 server is http://localhost:8080 by default
 
 i - make issuer key, use seed for generation, args: denomination
 h - make holder key, use seed for generation, args: issuer
 d - make draft, use seed for signing key, args: targetid value
+r - sign raw document, use seed for signing key, args: document
 q - query document, args: k|d|c id [server]
 s - submit a (key|draft|cert) document, args: k|d|c [server]
 v - verify a document (prints body of the document if ok)
@@ -173,6 +174,33 @@ func d(r []byte, target, value string) (err error) {
        return
 }
 
+// TODO: document.Sign does not handle dash escape
+func raw(r []byte, name string) (err error) {
+       e, err := key.Holder(r, "", "")
+       if err != nil {
+               return
+       }
+       log.Printf("signer: %s", key.Id(e))
+       f, err := os.Open(name)
+       if err != nil {
+               return
+       }
+       doc, err := readall(f)
+       if err != nil {
+               return
+       }
+       d, err := document.Sign(doc, e)
+       if err != nil {
+               return
+       }
+       s, err := document.FormatSigned(d)
+       if err != nil {
+               return
+       }
+       _, err = os.Stdout.Write(s)
+       return
+}
+
 func q(cmd, id, server string) (err error) {
        log.Printf("document id: %s, server: %s", id, server)
        m := map[string]string{
@@ -480,8 +508,9 @@ func storedir() string {
        return dir
 }
 
+// read at most 100k
 func readall(r io.Reader) ([]byte, error) {
-       b := make([]byte, 10000)
+       b := make([]byte, 100000)
        n, err := io.ReadFull(r, b)
        if err != io.ErrUnexpectedEOF {
                if err == nil {
@@ -519,6 +548,11 @@ func main() {
                        log.Fatal(usage)
                }
                err = d(read(), os.Args[2], os.Args[3])
+       case "r":
+               if len(os.Args) != 3 {
+                       log.Fatal(usage)
+               }
+               err = raw(read(), os.Args[2])
        case "q":
                cmd := ""
                id := ""