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 }