+armorkey, update epoint-client
[epoint] / cmd / armorkey / armorkey.go
diff --git a/cmd/armorkey/armorkey.go b/cmd/armorkey/armorkey.go
new file mode 100644 (file)
index 0000000..628f06a
--- /dev/null
@@ -0,0 +1,81 @@
+package main
+
+import (
+       "bufio"
+       "crypto/openpgp"
+       "crypto/openpgp/armor"
+       "flag"
+       "io"
+       "log"
+       "os"
+)
+
+var dearmor = flag.Bool("d", false, "dearmor binary key")
+var publiconly = flag.Bool("p", false, "ouput public part only, even if input is a private key")
+
+func serialize(w io.Writer, e *openpgp.Entity, publiconly bool) (err error) {
+       if publiconly {
+               err = e.Serialize(w)
+       } else {
+               err = e.SerializePrivate(w)
+       }
+       return
+}
+
+func code(e *openpgp.Entity, arm bool) (err error) {
+       pub := e.PrivateKey == nil || *publiconly
+       header := openpgp.PublicKeyType
+       if !pub {
+               header = openpgp.PrivateKeyType
+       }
+       out := bufio.NewWriter(os.Stdout)
+       if arm {
+               w, err1 := armor.Encode(out, header, nil)
+               err = err1
+               if err != nil {
+                       return
+               }
+               err = serialize(w, e, pub)
+               if err != nil {
+                       return
+               }
+               err = w.Close()
+               if err != nil {
+                       return
+               }
+               _, err = out.Write([]byte{'\n'})
+               if err != nil {
+                       return
+               }
+       } else {
+               err = serialize(out, e, pub)
+               if err != nil {
+                       return
+               }
+       }
+       err = out.Flush()
+       return
+}
+
+func main() {
+       flag.Parse()
+       var elist openpgp.EntityList
+       var err error
+       in := bufio.NewReader(os.Stdin)
+       if *dearmor {
+               elist, err = openpgp.ReadArmoredKeyRing(in)
+       } else {
+               elist, err = openpgp.ReadKeyRing(in)
+       }
+       if err != nil {
+               log.Fatal(err)
+       }
+       if len(elist) != 1 {
+               log.Fatal("expected a single key")
+       }
+       err = code(elist[0], !*dearmor)
+       if err != nil {
+               log.Fatal(err)
+       }
+       return
+}