--- /dev/null
+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
+}