routing/router: extract sessionKey generation
We extract the session key such that we can later store it across restarts.
This commit is contained in:
parent
ec087a9f73
commit
5a8b892bb6
@ -1404,12 +1404,22 @@ func (r *ChannelRouter) FindRoute(source, target route.Vertex,
|
|||||||
return route, nil
|
return route, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generateNewSessionKey generates a new ephemeral private key to be used for a
|
||||||
|
// payment attempt.
|
||||||
|
func generateNewSessionKey() (*btcec.PrivateKey, error) {
|
||||||
|
// Generate a new random session key to ensure that we don't trigger
|
||||||
|
// any replay.
|
||||||
|
//
|
||||||
|
// TODO(roasbeef): add more sources of randomness?
|
||||||
|
return btcec.NewPrivateKey(btcec.S256())
|
||||||
|
}
|
||||||
|
|
||||||
// generateSphinxPacket generates then encodes a sphinx packet which encodes
|
// generateSphinxPacket generates then encodes a sphinx packet which encodes
|
||||||
// the onion route specified by the passed layer 3 route. The blob returned
|
// the onion route specified by the passed layer 3 route. The blob returned
|
||||||
// from this function can immediately be included within an HTLC add packet to
|
// from this function can immediately be included within an HTLC add packet to
|
||||||
// be sent to the first hop within the route.
|
// be sent to the first hop within the route.
|
||||||
func generateSphinxPacket(rt *route.Route, paymentHash []byte) ([]byte,
|
func generateSphinxPacket(rt *route.Route, paymentHash []byte,
|
||||||
*sphinx.Circuit, error) {
|
sessionKey *btcec.PrivateKey) ([]byte, *sphinx.Circuit, error) {
|
||||||
|
|
||||||
// As a sanity check, we'll ensure that the set of hops has been
|
// As a sanity check, we'll ensure that the set of hops has been
|
||||||
// properly filled in, otherwise, we won't actually be able to
|
// properly filled in, otherwise, we won't actually be able to
|
||||||
@ -1433,15 +1443,6 @@ func generateSphinxPacket(rt *route.Route, paymentHash []byte) ([]byte,
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generate a new random session key to ensure that we don't trigger
|
|
||||||
// any replay.
|
|
||||||
//
|
|
||||||
// TODO(roasbeef): add more sources of randomness?
|
|
||||||
sessionKey, err := btcec.NewPrivateKey(btcec.S256())
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next generate the onion routing packet which allows us to perform
|
// Next generate the onion routing packet which allows us to perform
|
||||||
// privacy preserving source routing across the network.
|
// privacy preserving source routing across the network.
|
||||||
sphinxPacket, err := sphinx.NewOnionPacket(
|
sphinxPacket, err := sphinx.NewOnionPacket(
|
||||||
@ -1677,11 +1678,16 @@ func (r *ChannelRouter) sendPaymentAttempt(paySession *paymentSession,
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Generate a new key to be used for this attempt.
|
||||||
|
sessionKey, err := generateNewSessionKey()
|
||||||
|
if err != nil {
|
||||||
|
return [32]byte{}, true, err
|
||||||
|
}
|
||||||
// Generate the raw encoded sphinx packet to be included along
|
// Generate the raw encoded sphinx packet to be included along
|
||||||
// with the htlcAdd message that we send directly to the
|
// with the htlcAdd message that we send directly to the
|
||||||
// switch.
|
// switch.
|
||||||
onionBlob, circuit, err := generateSphinxPacket(
|
onionBlob, circuit, err := generateSphinxPacket(
|
||||||
route, paymentHash[:],
|
route, paymentHash[:], sessionKey,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return [32]byte{}, true, err
|
return [32]byte{}, true, err
|
||||||
|
@ -2442,8 +2442,9 @@ func TestIsStaleEdgePolicy(t *testing.T) {
|
|||||||
func TestEmptyRoutesGenerateSphinxPacket(t *testing.T) {
|
func TestEmptyRoutesGenerateSphinxPacket(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
sessionKey, _ := btcec.NewPrivateKey(btcec.S256())
|
||||||
emptyRoute := &route.Route{}
|
emptyRoute := &route.Route{}
|
||||||
_, _, err := generateSphinxPacket(emptyRoute, testHash[:])
|
_, _, err := generateSphinxPacket(emptyRoute, testHash[:], sessionKey)
|
||||||
if err != route.ErrNoRouteHopsProvided {
|
if err != route.ErrNoRouteHopsProvided {
|
||||||
t.Fatalf("expected empty hops error: instead got: %v", err)
|
t.Fatalf("expected empty hops error: instead got: %v", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user