From 972484fc5b360fb497aa2fbb621fb993a056f7c2 Mon Sep 17 00:00:00 2001 From: Timur Demin Date: Tue, 6 Jul 2021 01:11:14 +0500 Subject: [PATCH] Update for Yggdrasil 0.4.0 Yggdrasil switched to ed25519 keys in 0.4.0. This switches syg_go to new crypto code accordingly. --- crypto.go | 62 ++++++++++++++++++++++++++--------- crypto_test.go | 42 +++++++++++------------- go.mod | 4 +-- go.sum | 88 +++++++++++++++++++++++++++++--------------------- main.go | 45 +++++++++++++------------- 5 files changed, 141 insertions(+), 100 deletions(-) diff --git a/crypto.go b/crypto.go index bf40398..227abc0 100644 --- a/crypto.go +++ b/crypto.go @@ -1,34 +1,40 @@ package main import ( + "crypto/ed25519" + "crypto/rand" + "github.com/yggdrasil-network/yggdrasil-go/src/address" - "github.com/yggdrasil-network/yggdrasil-go/src/crypto" ) // custom function selectors, see crypto_xxx.go var ( - addrForNodeID func(*crypto.NodeID) *address.Address + addrForKey func(ed25519.PublicKey) *address.Address + generateKey func() (ed25519.PublicKey, ed25519.PrivateKey) ) -// AddrForNodeID is a variant of Yggdrasil's src/address.AddrForNodeID that +// copied from Yggdrasil in order to save time on GetPrefix() call +var prefix = [...]byte{0x02} + +// AddrForKey is a variant of Yggdrasil's src/address.AddrForKey that // might be slightly optimized for performance. // -// This function is a modded variant of address.AddrForNodeID from Yggdrasil. -// See src/address/address.go@78b5f88e4bb734d0dd6a138ff08d34ca39dcaea3 -func AddrForNodeID(nid *crypto.NodeID) *address.Address { - // 128 bit address, begins with GetPrefix(), with last bit set to 0 - // (indicates an address). Next 7 bits, interpreted as a uint, are the count - // of leading 1s in the NodeID. Leading 1s and first leading 0 of the NodeID - // are truncated off. The rest is appended to the IPv6 address (truncated to - // 128 bits total). +// This function is a modded variant of address.AddrForKey from Yggdrasil. +// See src/address/address.go@0cff56fcc17d1acaf5297a7024477a9ca1bd3590 +func AddrForKey(key ed25519.PublicKey) *address.Address { + var buf [ed25519.PublicKeySize]byte + copy(buf[:], key) + for idx := range buf { + buf[idx] = ^buf[idx] + } var addr address.Address - temp := make([]byte, 0, len(nid)) + var temp = make([]byte, 0, 128) done := false ones := byte(0) bits := byte(0) nBits := 0 - for idx := 0; idx < 8*len(nid); idx++ { - bit := (nid[idx/8] & (0x80 >> byte(idx%8))) >> byte(7-(idx%8)) + for idx := 0; idx < 8*len(buf); idx++ { + bit := (buf[idx/8] & (0x80 >> byte(idx%8))) >> byte(7-(idx%8)) if !done && bit != 0 { ones++ continue @@ -44,9 +50,35 @@ func AddrForNodeID(nid *crypto.NodeID) *address.Address { temp = append(temp, bits) } } - prefix := address.GetPrefix() copy(addr[:], prefix[:]) addr[len(prefix)] = ones copy(addr[len(prefix)+1:], temp) return &addr } + +// GenerateKey generates a ed25519 public/private key pair using entropy from +// crypto/rand. It assumes crypto/rand always blocks in order to bypass some +// checks to spend less time generating keys. +// +// This function is a modded variant of GenerateKey from crypto/ed25519 built-in +// Go package from Go 1.16.5. +func GenerateKey() (ed25519.PublicKey, ed25519.PrivateKey) { + seed := make([]byte, ed25519.SeedSize) + rand.Reader.Read(seed) + + privateKey := ed25519.NewKeyFromSeed(seed) + publicKey := make([]byte, ed25519.PublicKeySize) + copy(publicKey, privateKey[32:]) + + return publicKey, privateKey +} + +// GenerateKeyEd25519 wraps crypto/ed25519.GenerateKey(). It panics if errors +// are encountered. +func GenerateKeyEd25519() (ed25519.PublicKey, ed25519.PrivateKey) { + pub, priv, err := ed25519.GenerateKey(nil) + if err != nil { + panic(err) + } + return pub, priv +} diff --git a/crypto_test.go b/crypto_test.go index 90aa4a0..e5626ae 100644 --- a/crypto_test.go +++ b/crypto_test.go @@ -1,28 +1,26 @@ package main import ( + "crypto/ed25519" "net" "os" "regexp" "testing" "github.com/yggdrasil-network/yggdrasil-go/src/address" - "github.com/yggdrasil-network/yggdrasil-go/src/crypto" ) var ( - testAddr *address.Address - testPub *crypto.BoxPubKey - testNodeID *crypto.NodeID - testRegex *regexp.Regexp + testAddr *address.Address + testPub ed25519.PublicKey + testRegex *regexp.Regexp = regexp.MustCompile("::") ) -func TestAddrForNodeID(t *testing.T) { - for i := 20; i > 0; i-- { - pub, _ := crypto.NewBoxKeys() - id := crypto.GetNodeID(pub) - origIP := net.IP(address.AddrForNodeID(id)[:]) - modIP := net.IP(AddrForNodeID(id)[:]) +func TestAddrForKey(t *testing.T) { + for i := 100000; i > 0; i-- { + pub, _ := GenerateKeyEd25519() + origIP := net.IP(address.AddrForKey(pub)[:]) + modIP := net.IP(AddrForKey(pub)[:]) if !origIP.Equal(modIP) { t.Errorf("got %s, expected %s", modIP, origIP) } @@ -30,30 +28,27 @@ func TestAddrForNodeID(t *testing.T) { } func TestMain(m *testing.M) { - testPub, _ = crypto.NewBoxKeys() - testNodeID = crypto.GetNodeID(testPub) - testRegex = regexp.MustCompile("::") + testPub, _ = GenerateKeyEd25519() os.Exit(m.Run()) } -func BenchmarkOrigAddrForNodeID(b *testing.B) { +func BenchmarkOrigAddrKey(b *testing.B) { for i := 0; i < b.N; i++ { - testAddr = address.AddrForNodeID(testNodeID) + testAddr = address.AddrForKey(testPub) } } -func BenchmarkModdedAddrForNodeID(b *testing.B) { +func BenchmarkModdedAddrForKey(b *testing.B) { for i := 0; i < b.N; i++ { - testAddr = AddrForNodeID(testNodeID) + testAddr = AddrForKey(testPub) } } // measures overall performance of code from cmd/genkeys func BenchmarkOrigLoop(b *testing.B) { for i := 0; i < b.N; i++ { - pub, _ := crypto.NewBoxKeys() - id := crypto.GetNodeID(pub) - ip := net.IP(address.AddrForNodeID(id)[:]).String() + pub, _ := GenerateKeyEd25519() + ip := net.IP(address.AddrForKey(pub)[:]).String() testRegex.MatchString(ip) } } @@ -61,9 +56,8 @@ func BenchmarkOrigLoop(b *testing.B) { // measures overall performance of functions we vendor func BenchmarkModdedLoop(b *testing.B) { for i := 0; i < b.N; i++ { - pub, _ := crypto.NewBoxKeys() - id := crypto.GetNodeID(pub) - ip := net.IP(AddrForNodeID(id)[:]).String() + pub, _ := GenerateKey() + ip := net.IP(AddrForKey(pub)[:]).String() testRegex.MatchString(ip) } } diff --git a/go.mod b/go.mod index fe00e6b..177a941 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ module git.tdem.in/tdemin/syg_go -go 1.14 +go 1.16 -require github.com/yggdrasil-network/yggdrasil-go v0.3.14 +require github.com/yggdrasil-network/yggdrasil-go v0.4.0 diff --git a/go.sum b/go.sum index 022267e..65ce7ed 100644 --- a/go.sum +++ b/go.sum @@ -1,43 +1,59 @@ -github.com/Arceliar/phony v0.0.0-20191006174943-d0c68492aca0/go.mod h1:6Lkn+/zJilRMsKmbmG1RPoamiArC6HS73xbwRyp3UyI= +github.com/Arceliar/ironwood v0.0.0-20210619124114-6ad55cae5031/go.mod h1:RP72rucOFm5udrnEzTmIWLRVGQiV/fSUAQXJ0RST/nk= +github.com/Arceliar/phony v0.0.0-20210209235338-dde1a8dca979/go.mod h1:6Lkn+/zJilRMsKmbmG1RPoamiArC6HS73xbwRyp3UyI= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/gologme/log v0.0.0-20181207131047-4e5d8ccb38e8/go.mod h1:gq31gQ8wEHkR+WekdWsqDuf8pXTUZA9BnnzTuPz1Y9U= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/gologme/log v1.2.0/go.mod h1:gq31gQ8wEHkR+WekdWsqDuf8pXTUZA9BnnzTuPz1Y9U= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hjson/hjson-go v3.0.1-0.20190209023717-9147687966d9+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio= -github.com/kardianos/minwinsvc v0.0.0-20151122163309-cad6b2b879b0/go.mod h1:rUi0/YffDo1oXBOGn1KRq7Fr07LX48XEBecQnmwjsAo= -github.com/lxn/walk v0.0.0-20191128110447-55ccb3a9f5c1/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/win v0.0.0-20191128105842-2da648fda5b4/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netns v0.0.0-20190625233234-7109fa855b0f/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/yggdrasil-network/yggdrasil-go v0.3.14 h1:vWzYzCQxOruS+J5FkLfXOS0JhCJx1yI9Erj/h2wfZ/E= -github.com/yggdrasil-network/yggdrasil-go v0.3.14/go.mod h1:rkQzLzVHlFdzsEMG+bDdTI+KeWPCZq1HpXRFzwinf6M= +github.com/hjson/hjson-go v3.1.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio= +github.com/kardianos/minwinsvc v1.0.0/go.mod h1:Bgd0oc+D0Qo3bBytmNtyRKVlp85dAloLKhfxanPFFRc= +github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/yggdrasil-network/yggdrasil-go v0.4.0 h1:H2CS2pTjCTzNQMHFU7sEW3Ge59fQWQbUeh6fVUO1Gi0= +github.com/yggdrasil-network/yggdrasil-go v0.4.0/go.mod h1:/iMJjOrXRsjlFgqhWOPhecOKi7xHmHiY4/En3A42Fog= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200301040627-c5d0d7b4ec88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7-0.20210503195748-5c7c50ebbd4f/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.zx2c4.com/wireguard v0.0.20200122-0.20200214175355-9cbcff10dd3e/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20200320/go.mod h1:lDian4Sw4poJ04SgHh35nzMVwGSYlPumkdnHcucAQoY= -golang.zx2c4.com/wireguard/windows v0.1.0/go.mod h1:EK7CxrFnicmYJ0ZCF6crBh2/EMMeSxMlqgLlwN0Kv9s= +golang.zx2c4.com/wireguard v0.0.0-20210510202332-9844c74f67ec/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg= +golang.zx2c4.com/wireguard v0.0.0-20210604143328-f9b48a961cd2/go.mod h1:laHzsbfMhGSobUmruXWAyMKKHSqvIcrqZJMyHD+/3O8= +golang.zx2c4.com/wireguard/windows v0.3.14/go.mod h1:3P4IEAsb+BjlKZmpUXgy74c0iX9AVwwr3WcVJ8nPgME= diff --git a/main.go b/main.go index 24a6eda..c5051d6 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ See cmd/genkeys/main.go@78b5f88e4bb734d0dd6a138ff08d34ca39dcaea3 */ import ( + "crypto/ed25519" "encoding/hex" "flag" "log" @@ -17,7 +18,6 @@ import ( "runtime" "github.com/yggdrasil-network/yggdrasil-go/src/address" - "github.com/yggdrasil-network/yggdrasil-go/src/crypto" ) var ( @@ -47,10 +47,12 @@ func main() { if *origCode { stdout.Println("using unmodified Yggdrasil code") - addrForNodeID = address.AddrForNodeID + addrForKey = address.AddrForKey + generateKey = GenerateKeyEd25519 } else { stdout.Println("using syg_go vendored code") - addrForNodeID = AddrForNodeID + addrForKey = AddrForKey + generateKey = GenerateKey } regex, err := regexp.Compile(*rxflag) @@ -60,13 +62,11 @@ func main() { } newKeys := make(chan keySet, *threads) - var currentBest []byte - - if !*highAddressMode { - stdout.Printf("starting mining for %v with %v threads\n", regex, *threads) - } else { - stdout.Printf("starting mining higher addresses with %v threads\n", *threads) + var currentBest = make(ed25519.PublicKey, ed25519.PublicKeySize) + for i := range currentBest { + currentBest[i] = 0xff } + for i := 0; i < *threads; i++ { go doBoxKeys(newKeys) } @@ -74,6 +74,7 @@ func main() { counter := uint64(0) i := uint64(*iterationsPerOutput) if !*highAddressMode { + stdout.Printf("starting mining for %v with %v threads\n", regex, *threads) for { newKey := <-newKeys if regex.MatchString(newKey.ip) { @@ -85,10 +86,11 @@ func main() { } } } else { + stdout.Printf("starting mining higher addresses with %v threads\n", *threads) for { newKey := <-newKeys - if isBetter(currentBest[:], newKey.id) || len(currentBest) == 0 { - currentBest = newKey.id + if isBetter(currentBest, newKey.pub) { + currentBest = newKey.pub newKey.print() } counter++ @@ -102,34 +104,31 @@ func main() { type keySet struct { priv []byte pub []byte - id []byte ip string } func (k *keySet) print() { - stdout.Printf("priv: %s | pub: %s | nodeid: %s | ip: %s\n", + stdout.Printf("priv: %s | pub: %s | ip: %s\n", hex.EncodeToString(k.priv[:]), hex.EncodeToString(k.pub[:]), - hex.EncodeToString(k.id[:]), k.ip) } func doBoxKeys(out chan<- keySet) { for { - pub, priv := crypto.NewBoxKeys() - id := crypto.GetNodeID(pub) - ip := net.IP(addrForNodeID(id)[:]).String() - out <- keySet{priv[:], pub[:], id[:], ip} + pub, priv := generateKey() + ip := net.IP(addrForKey(pub)[:]).String() + out <- keySet{priv[:], pub[:], ip} } } -func isBetter(oldID, newID []byte) bool { - for i := range oldID { - if newID[i] > oldID[i] { +func isBetter(oldPub, newPub ed25519.PublicKey) bool { + for i := range oldPub { + if newPub[i] < oldPub[i] { return true } - if newID[i] < oldID[i] { - return false + if newPub[i] > oldPub[i] { + break } } return false