diff options
Diffstat (limited to 'src/gnunet/cmd/vanityid/main.go')
-rw-r--r-- | src/gnunet/cmd/vanityid/main.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/gnunet/cmd/vanityid/main.go b/src/gnunet/cmd/vanityid/main.go new file mode 100644 index 0000000..938df61 --- /dev/null +++ b/src/gnunet/cmd/vanityid/main.go | |||
@@ -0,0 +1,53 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
4 | "crypto/rand" | ||
5 | "encoding/hex" | ||
6 | "flag" | ||
7 | "fmt" | ||
8 | "regexp" | ||
9 | "time" | ||
10 | |||
11 | "github.com/bfix/gospel/crypto/ed25519" | ||
12 | "gnunet/util" | ||
13 | ) | ||
14 | |||
15 | func main() { | ||
16 | // get arguments | ||
17 | flag.Parse() | ||
18 | prefixes := flag.Args() | ||
19 | num := len(prefixes) | ||
20 | if num == 0 { | ||
21 | fmt.Println("No prefixes specified -- done.") | ||
22 | return | ||
23 | } | ||
24 | |||
25 | // pre-compile regexp | ||
26 | reg := make([]*regexp.Regexp, num) | ||
27 | for i, p := range prefixes { | ||
28 | reg[i] = regexp.MustCompile(p) | ||
29 | } | ||
30 | |||
31 | // generate new keys in a loop | ||
32 | seed := make([]byte, 32) | ||
33 | start := time.Now() | ||
34 | for i := 0; ; i++ { | ||
35 | n, err := rand.Read(seed) | ||
36 | if err != nil || n != 32 { | ||
37 | panic(err) | ||
38 | } | ||
39 | prv := ed25519.NewPrivateKeyFromSeed(seed) | ||
40 | pub := prv.Public().Bytes() | ||
41 | id := util.EncodeBinaryToString(pub) | ||
42 | for _, r := range reg { | ||
43 | if r.MatchString(id) { | ||
44 | elapsed := time.Now().Sub(start) | ||
45 | s1 := hex.EncodeToString(seed) | ||
46 | s2 := hex.EncodeToString(prv.D.Bytes()) | ||
47 | fmt.Printf("%s [%s][%s] (%d tries, %s elapsed)\n", id, s1, s2, i, elapsed) | ||
48 | i = 0 | ||
49 | start = time.Now() | ||
50 | } | ||
51 | } | ||
52 | } | ||
53 | } | ||