-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
key_v2.go
107 lines (90 loc) · 1.93 KB
/
key_v2.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package p2pkey
import (
"crypto/ed25519"
"crypto/rand"
"encoding/hex"
"fmt"
"math/big"
cryptop2p "github.com/libp2p/go-libp2p-core/crypto"
peer "github.com/libp2p/go-libp2p-core/peer"
)
type Raw []byte
func (raw Raw) Key() KeyV2 {
privKey, err := cryptop2p.UnmarshalPrivateKey(raw)
if err != nil {
panic(err)
}
key, err := fromPrivkey(privKey)
if err != nil {
panic(err)
}
return key
}
func (raw Raw) String() string {
return "<P2P Raw Private Key>"
}
func (raw Raw) GoString() string {
return raw.String()
}
var _ fmt.GoStringer = &KeyV2{}
type KeyV2 struct {
cryptop2p.PrivKey
peerID PeerID
}
func NewV2() (KeyV2, error) {
privKey, _, err := cryptop2p.GenerateEd25519Key(rand.Reader)
if err != nil {
return KeyV2{}, err
}
return fromPrivkey(privKey)
}
func MustNewV2XXXTestingOnly(k *big.Int) KeyV2 {
seed := make([]byte, ed25519.SeedSize)
copy(seed, k.Bytes())
pk := ed25519.NewKeyFromSeed(seed[:])
p2pPrivKey, err := cryptop2p.UnmarshalEd25519PrivateKey(pk[:])
if err != nil {
panic(err)
}
key, err := fromPrivkey(p2pPrivKey)
if err != nil {
panic(err)
}
return key
}
func (key KeyV2) ID() string {
return peer.ID(key.peerID).String()
}
func (key KeyV2) Raw() Raw {
marshalledPrivK, err := cryptop2p.MarshalPrivateKey(key.PrivKey)
if err != nil {
panic(err)
}
return marshalledPrivK
}
func (key KeyV2) PeerID() PeerID {
return key.peerID
}
func (key KeyV2) PublicKeyHex() string {
pubKeyBytes, err := key.GetPublic().Raw()
if err != nil {
panic(err)
}
return hex.EncodeToString(pubKeyBytes)
}
func (key KeyV2) String() string {
return fmt.Sprintf("P2PKeyV2{PrivateKey: <redacted>, PeerID: %s}", key.peerID.Raw())
}
func (key KeyV2) GoString() string {
return key.String()
}
func fromPrivkey(privKey cryptop2p.PrivKey) (KeyV2, error) {
peerID, err := peer.IDFromPrivateKey(privKey)
if err != nil {
return KeyV2{}, err
}
return KeyV2{
PrivKey: privKey,
peerID: PeerID(peerID),
}, nil
}