/
main.go
85 lines (78 loc) · 1.85 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Public domain.
// Encodes things read from stdin into base32.
package main
import (
"encoding/base32"
"flag"
"fmt"
"io/ioutil"
"os"
"strings"
)
var (
fDecode = flag.Bool("d", false, "decode")
fLowerCase = flag.Bool("l", false, "lower case")
fNoNewLine = flag.Bool("n", false, "do not print the trailing newline character")
fTrimPadding = flag.Bool("p", false, "remove padding")
fAlphabet = flag.String("a", "", `alphabet ("" = standard, "hex", "zooko", or alphabet characters)`)
fGroup = flag.Int("g", 0, "split into groups of N characters")
fGroupSep = flag.String("gs", " ", "group separator for -g option")
)
var encodings = map[string]*base32.Encoding{
"": base32.StdEncoding,
"hex": base32.HexEncoding,
"zooko": base32.NewEncoding("YBNDRFG8EJKMCPQXOT1UWISZA345H769"),
"dnscurve": base32.NewEncoding("0123456789BCDFGHJKLMNPQRSTUVWXYZ"),
}
func main() {
flag.Parse()
b, err := ioutil.ReadAll(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err)
os.Exit(1)
}
alpha := *fAlphabet
enc, ok := encodings[alpha]
if !ok {
if len(alpha) != 32 {
fmt.Fprintf(os.Stderr, "unknown alphabet: %s\n", alpha)
os.Exit(2)
}
enc = base32.NewEncoding(alpha)
}
if *fDecode {
d, err := enc.DecodeString(strings.ToUpper(string(b)))
if err != nil {
fmt.Println(string(b))
fmt.Fprintf(os.Stderr, "error decoding: %s\n", err)
os.Exit(3)
}
if _, err := os.Stdout.Write(d); err != nil {
fmt.Fprintf(os.Stderr, "error writing: %s\n", err)
os.Exit(4)
}
return
}
s := enc.EncodeToString(b)
if *fLowerCase {
s = strings.ToLower(s)
}
if *fTrimPadding {
s = strings.TrimRight(s, "=")
}
g := *fGroup
if g > 0 {
rs := ""
for i, r := range s {
if i > 0 && i%g == 0 {
rs += *fGroupSep
}
rs += string(r)
}
s = rs
}
fmt.Print(s)
if !*fNoNewLine {
fmt.Print("\n")
}
}