+armorkey, update epoint-client
[epoint] / cmd / armorkey / armorkey.go
1 package main
2
3 import (
4         "bufio"
5         "crypto/openpgp"
6         "crypto/openpgp/armor"
7         "flag"
8         "io"
9         "log"
10         "os"
11 )
12
13 var dearmor = flag.Bool("d", false, "dearmor binary key")
14 var publiconly = flag.Bool("p", false, "ouput public part only, even if input is a private key")
15
16 func serialize(w io.Writer, e *openpgp.Entity, publiconly bool) (err error) {
17         if publiconly {
18                 err = e.Serialize(w)
19         } else {
20                 err = e.SerializePrivate(w)
21         }
22         return
23 }
24
25 func code(e *openpgp.Entity, arm bool) (err error) {
26         pub := e.PrivateKey == nil || *publiconly
27         header := openpgp.PublicKeyType
28         if !pub {
29                 header = openpgp.PrivateKeyType
30         }
31         out := bufio.NewWriter(os.Stdout)
32         if arm {
33                 w, err1 := armor.Encode(out, header, nil)
34                 err = err1
35                 if err != nil {
36                         return
37                 }
38                 err = serialize(w, e, pub)
39                 if err != nil {
40                         return
41                 }
42                 err = w.Close()
43                 if err != nil {
44                         return
45                 }
46                 _, err = out.Write([]byte{'\n'})
47                 if err != nil {
48                         return
49                 }
50         } else {
51                 err = serialize(out, e, pub)
52                 if err != nil {
53                         return
54                 }
55         }
56         err = out.Flush()
57         return
58 }
59
60 func main() {
61         flag.Parse()
62         var elist openpgp.EntityList
63         var err error
64         in := bufio.NewReader(os.Stdin)
65         if *dearmor {
66                 elist, err = openpgp.ReadArmoredKeyRing(in)
67         } else {
68                 elist, err = openpgp.ReadKeyRing(in)
69         }
70         if err != nil {
71                 log.Fatal(err)
72         }
73         if len(elist) != 1 {
74                 log.Fatal("expected a single key")
75         }
76         err = code(elist[0], !*dearmor)
77         if err != nil {
78                 log.Fatal(err)
79         }
80         return
81 }