channeldb: read raw htlc attempt session key

This commit is contained in:
carla 2021-05-19 09:03:52 +02:00
parent eb068bf666
commit 8071ebb16a
No known key found for this signature in database
GPG Key ID: 4CA7FE54A6213C91
5 changed files with 52 additions and 23 deletions

@ -53,7 +53,7 @@ type duplicateHTLCAttemptInfo struct {
attemptID uint64 attemptID uint64
// sessionKey is the ephemeral key used for this attempt. // sessionKey is the ephemeral key used for this attempt.
sessionKey *btcec.PrivateKey sessionKey [btcec.PrivKeyBytesLen]byte
// route is the route attempted to send the HTLC. // route is the route attempted to send the HTLC.
route route.Route route route.Route

@ -21,8 +21,10 @@ type HTLCAttemptInfo struct {
// AttemptID is the unique ID used for this attempt. // AttemptID is the unique ID used for this attempt.
AttemptID uint64 AttemptID uint64
// sessionKey is the ephemeral key used for this attempt. // sessionKey is the raw bytes ephemeral key used for this attempt.
sessionKey *btcec.PrivateKey // These bytes are lazily read off disk to save ourselves the expensive
// EC operations used by btcec.PrivKeyFromBytes.
sessionKey [btcec.PrivKeyBytesLen]byte
// Route is the route attempted to send the HTLC. // Route is the route attempted to send the HTLC.
Route route.Route Route route.Route
@ -43,18 +45,23 @@ func NewHtlcAttemptInfo(attemptID uint64, sessionKey *btcec.PrivateKey,
route route.Route, attemptTime time.Time, route route.Route, attemptTime time.Time,
hash *lntypes.Hash) *HTLCAttemptInfo { hash *lntypes.Hash) *HTLCAttemptInfo {
var scratch [btcec.PrivKeyBytesLen]byte
copy(scratch[:], sessionKey.Serialize())
return &HTLCAttemptInfo{ return &HTLCAttemptInfo{
AttemptID: attemptID, AttemptID: attemptID,
sessionKey: sessionKey, sessionKey: scratch,
Route: route, Route: route,
AttemptTime: attemptTime, AttemptTime: attemptTime,
Hash: hash, Hash: hash,
} }
} }
// SessionKey returns the ephemeral key used for a htlc attempt. // SessionKey returns the ephemeral key used for a htlc attempt. This function
// performs expensive ec-ops to obtain the session key.
func (h *HTLCAttemptInfo) SessionKey() *btcec.PrivateKey { func (h *HTLCAttemptInfo) SessionKey() *btcec.PrivateKey {
return h.sessionKey priv, _ := btcec.PrivKeyFromBytes(btcec.S256(), h.sessionKey[:])
return priv
} }
// HTLCAttempt contains information about a specific HTLC attempt for a given // HTLCAttempt contains information about a specific HTLC attempt for a given

@ -0,0 +1,27 @@
package channeldb
import (
"bytes"
"testing"
"github.com/stretchr/testify/require"
)
// TestLazySessionKeyDeserialize tests that we can read htlc attempt session
// keys that were previously serialized as a private key as raw bytes.
func TestLazySessionKeyDeserialize(t *testing.T) {
var b bytes.Buffer
// Serialize as a private key.
err := WriteElements(&b, priv)
require.NoError(t, err)
// Deserialize into [btcec.PrivKeyBytesLen]byte.
attempt := HTLCAttemptInfo{}
err = ReadElements(&b, &attempt.sessionKey)
require.NoError(t, err)
require.Zero(t, b.Len())
sessionKey := attempt.SessionKey()
require.Equal(t, priv, sessionKey)
}

@ -37,17 +37,15 @@ func genInfo() (*PaymentCreationInfo, *HTLCAttemptInfo,
} }
rhash := sha256.Sum256(preimage[:]) rhash := sha256.Sum256(preimage[:])
attempt := NewHtlcAttemptInfo(
0, priv, *testRoute.Copy(), time.Time{}, nil,
)
return &PaymentCreationInfo{ return &PaymentCreationInfo{
PaymentIdentifier: rhash, PaymentIdentifier: rhash,
Value: testRoute.ReceiverAmt(), Value: testRoute.ReceiverAmt(),
CreationTime: time.Unix(time.Now().Unix(), 0), CreationTime: time.Unix(time.Now().Unix(), 0),
PaymentRequest: []byte("hola"), PaymentRequest: []byte("hola"),
}, }, attempt, preimage, nil
&HTLCAttemptInfo{
AttemptID: 0,
sessionKey: priv,
Route: *testRoute.Copy(),
}, preimage, nil
} }
// TestPaymentControlSwitchFail checks that payment status returns to Failed // TestPaymentControlSwitchFail checks that payment status returns to Failed

@ -68,13 +68,10 @@ func makeFakeInfo() (*PaymentCreationInfo, *HTLCAttemptInfo) {
PaymentRequest: []byte(""), PaymentRequest: []byte(""),
} }
a := &HTLCAttemptInfo{ a := NewHtlcAttemptInfo(
AttemptID: 44, 44, priv, testRoute, time.Unix(100, 0), &hash,
sessionKey: priv, )
Route: testRoute,
AttemptTime: time.Unix(100, 0),
Hash: &hash,
}
return c, a return c, a
} }