This commit improves TLV decoding safety and consistency across multiple
packages by enforcing fixed-length requirements and adding unit tests to
prevent malformed TLV records from being accepted.
Changes include:
- lnwire:
* Enforce 8-byte length in Fee TLV decoder.
* Enforce PubNonceSize in Musig2Nonce TLV decoder.
* Enforce 8-byte length in ShortChannelID TLV decoder.
* Added roundtrip and invalid length tests for Fee, Musig2Nonce,
and ShortChannelID records.
- routing/route:
* Enforce Vertex TLV length (33 bytes).
* Added encode/decode and invalid length tests for Vertex.
- tlv:
* Enforce correct length in DBytes33 decoder (33 bytes).
* Added tests ensuring all fixed-size primitive decoders reject
incorrect TLV lengths.
By strictly validating TLV lengths, we prevent malformed or corrupted
TLV records from being silently accepted, improving protocol safety.
70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package lnwire
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/btcsuite/btcd/btcec/v2/schnorr/musig2"
|
|
"github.com/lightningnetwork/lnd/tlv"
|
|
)
|
|
|
|
// NonceRecordTypeT is the TLV type used to encode a local musig2 nonce.
|
|
type NonceRecordTypeT = tlv.TlvType4
|
|
|
|
// nonceRecordType is the TLV (integer) type used to encode a local musig2
|
|
// nonce.
|
|
var nonceRecordType tlv.Type = (NonceRecordTypeT)(nil).TypeVal()
|
|
|
|
type (
|
|
// Musig2Nonce represents a musig2 public nonce, which is the
|
|
// concatenation of two EC points serialized in compressed format.
|
|
Musig2Nonce [musig2.PubNonceSize]byte
|
|
|
|
// Musig2NonceTLV is a TLV type that can be used to encode/decode a
|
|
// musig2 nonce. This is an optional TLV.
|
|
Musig2NonceTLV = tlv.RecordT[NonceRecordTypeT, Musig2Nonce]
|
|
|
|
// OptMusig2NonceTLV is a TLV type that can be used to encode/decode a
|
|
// musig2 nonce.
|
|
OptMusig2NonceTLV = tlv.OptionalRecordT[NonceRecordTypeT, Musig2Nonce]
|
|
)
|
|
|
|
// Record returns a TLV record that can be used to encode/decode the musig2
|
|
// nonce from a given TLV stream.
|
|
func (m *Musig2Nonce) Record() tlv.Record {
|
|
return tlv.MakeStaticRecord(
|
|
nonceRecordType, m, musig2.PubNonceSize,
|
|
nonceTypeEncoder, nonceTypeDecoder,
|
|
)
|
|
}
|
|
|
|
// nonceTypeEncoder is a custom TLV encoder for the Musig2Nonce type.
|
|
func nonceTypeEncoder(w io.Writer, val interface{}, _ *[8]byte) error {
|
|
if v, ok := val.(*Musig2Nonce); ok {
|
|
_, err := w.Write(v[:])
|
|
return err
|
|
}
|
|
|
|
return tlv.NewTypeForEncodingErr(val, "lnwire.Musig2Nonce")
|
|
}
|
|
|
|
// nonceTypeDecoder is a custom TLV decoder for the Musig2Nonce record.
|
|
func nonceTypeDecoder(r io.Reader, val interface{}, _ *[8]byte,
|
|
l uint64) error {
|
|
|
|
if v, ok := val.(*Musig2Nonce); ok && l == musig2.PubNonceSize {
|
|
_, err := io.ReadFull(r, v[:])
|
|
return err
|
|
}
|
|
|
|
return tlv.NewTypeForDecodingErr(
|
|
val, "lnwire.Musig2Nonce", l, musig2.PubNonceSize,
|
|
)
|
|
}
|
|
|
|
// SomeMusig2Nonce is a helper function that creates a musig2 nonce TLV.
|
|
func SomeMusig2Nonce(nonce Musig2Nonce) OptMusig2NonceTLV {
|
|
return tlv.SomeRecordT(
|
|
tlv.NewRecordT[NonceRecordTypeT, Musig2Nonce](nonce),
|
|
)
|
|
}
|