-
Notifications
You must be signed in to change notification settings - Fork 8
/
peer.go
93 lines (79 loc) · 2.05 KB
/
peer.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
package peer
import (
"context"
"crypto/rand"
"github.com/libp2p/go-libp2p/core/crypto"
lpeer "github.com/libp2p/go-libp2p/core/peer"
)
// Peer is the common interface for a keypair-based identity.
type Peer interface {
// GetPeerID returns the peer ID.
GetPeerID() ID
// GetPubKey returns the public key of the peer.
GetPubKey() crypto.PubKey
// GetPrivKey returns the private key.
// This may require an extra lookup operation.
// Returns ErrNoPrivKey if the private key is unavailable.
GetPrivKey(ctx context.Context) (crypto.PrivKey, error)
}
// NewPeer builds a new Peer object with a private key.
// If privKey is nil, one will be generated.
func NewPeer(privKey crypto.PrivKey) (Peer, error) {
if privKey == nil {
var err error
privKey, _, err = crypto.GenerateEd25519Key(rand.Reader)
if err != nil {
return nil, err
}
}
id, err := lpeer.IDFromPrivateKey(privKey)
if err != nil {
return nil, err
}
return &peer{
privKey: privKey,
pubKey: privKey.GetPublic(),
peerID: id,
}, nil
}
// NewPeerWithPubKey builds a Peer with a public key.
func NewPeerWithPubKey(pubKey crypto.PubKey) (Peer, error) {
id, err := lpeer.IDFromPublicKey(pubKey)
if err != nil {
return nil, err
}
return &peer{
pubKey: pubKey,
peerID: id,
}, nil
}
// NewPeerWithID constructs a new Peer by extracting the pubkey from the ID.
func NewPeerWithID(id lpeer.ID) (Peer, error) {
pubKey, err := id.ExtractPublicKey()
if err != nil {
return nil, err
}
return NewPeerWithPubKey(pubKey)
}
// peer implements Peer with an in-memory struct.
type peer struct {
privKey crypto.PrivKey
pubKey crypto.PubKey
peerID ID
}
// GetPeerID returns the peer ID.
func (p *peer) GetPeerID() ID {
return p.peerID
}
// GetPubKey returns the public key of the peer.
func (p *peer) GetPubKey() crypto.PubKey {
return p.pubKey
}
// GetPrivKey returns the private key.
// May be empty if peer private key is unavailable.
func (p *peer) GetPrivKey(ctx context.Context) (crypto.PrivKey, error) {
if p.privKey == nil {
return nil, ErrNoPrivKey
}
return p.privKey, nil
}