lnwire: all hashes within the protocol are now 32-bytes

We now enforce that the site of all revocation pre-images+hashes (used
for HTLC’s) are now 32-bytes.

Additionally, all payment pre-images are now required to be 32-bytes
not he wire. There also exists a Script level enforcement of the
payment pre-image size at a lower level.

This commit serves to unify the sizes of all hashes/pre-images across
the codebase.
This commit is contained in:
Olaoluwa Osuntokun 2016-06-30 11:53:11 -07:00
parent fd02c1c1aa
commit bba9b665ef
No known key found for this signature in database
GPG Key ID: 9CC5B105D03521A2
10 changed files with 29 additions and 23 deletions

@ -46,7 +46,7 @@ type FundingRequest struct {
// 2: channel responder // 2: channel responder
FeePayer uint8 FeePayer uint8
RevocationHash [20]byte RevocationHash [32]byte
Pubkey *btcec.PublicKey Pubkey *btcec.PublicKey
DeliveryPkScript PkScript // *MUST* be either P2PKH or P2SH DeliveryPkScript PkScript // *MUST* be either P2PKH or P2SH
ChangePkScript PkScript // *MUST* be either P2PKH or P2SH ChangePkScript PkScript // *MUST* be either P2PKH or P2SH

@ -9,8 +9,6 @@ import (
) )
func TestFundingRequestEncodeDecode(t *testing.T) { func TestFundingRequestEncodeDecode(t *testing.T) {
copy(revocationHash[:], revocationHashBytes)
// funding request // funding request
fr := &FundingRequest{ fr := &FundingRequest{
ReservationID: uint64(12345678), ReservationID: uint64(12345678),
@ -23,7 +21,7 @@ func TestFundingRequestEncodeDecode(t *testing.T) {
FeePayer: uint8(0), FeePayer: uint8(0),
PaymentAmount: btcutil.Amount(1234567), PaymentAmount: btcutil.Amount(1234567),
MinDepth: uint32(6), MinDepth: uint32(6),
RevocationHash: revocationHash, RevocationHash: revHash,
Pubkey: pubKey, Pubkey: pubKey,
DeliveryPkScript: deliveryPkScript, DeliveryPkScript: deliveryPkScript,
ChangePkScript: changePkScript, ChangePkScript: changePkScript,

@ -30,7 +30,7 @@ type FundingResponse struct {
// 2: channel responder // 2: channel responder
FeePayer uint8 FeePayer uint8
RevocationHash [20]byte RevocationHash [32]byte
Pubkey *btcec.PublicKey Pubkey *btcec.PublicKey
CommitSig *btcec.Signature // Requester's Commitment CommitSig *btcec.Signature // Requester's Commitment
DeliveryPkScript PkScript // *MUST* be either P2PKH or P2SH DeliveryPkScript PkScript // *MUST* be either P2PKH or P2SH

@ -21,7 +21,7 @@ func TestFundingResponseEncodeDecode(t *testing.T) {
MinDepth: uint32(6), MinDepth: uint32(6),
LockTime: uint32(4320), // 30 block-days LockTime: uint32(4320), // 30 block-days
FeePayer: uint8(1), FeePayer: uint8(1),
RevocationHash: revocationHash, RevocationHash: revHash,
Pubkey: pubKey, Pubkey: pubKey,
CommitSig: commitSig, CommitSig: commitSig,
DeliveryPkScript: deliveryPkScript, DeliveryPkScript: deliveryPkScript,

@ -45,7 +45,7 @@ type HTLCAddRequest struct {
// number of pre-images for each of the listed hashes. For regular HTLC's // number of pre-images for each of the listed hashes. For regular HTLC's
// this slice only has one hash. However, for "multi-sig" HTLC's, the // this slice only has one hash. However, for "multi-sig" HTLC's, the
// length of this slice should be N. // length of this slice should be N.
RedemptionHashes [][20]byte RedemptionHashes [][32]byte
// OnionBlob is the raw serialized mix header used to route an HTLC in // OnionBlob is the raw serialized mix header used to route an HTLC in
// a privacy-preserving manner. The mix header is defined currently to // a privacy-preserving manner. The mix header is defined currently to
@ -78,7 +78,7 @@ func (c *HTLCAddRequest) Decode(r io.Reader, pver uint32) error {
// Expiry(4) // Expiry(4)
// Amount(4) // Amount(4)
// ContractType(1) // ContractType(1)
// RedemptionHashes (numOfHashes * 20 + numOfHashes) // RedemptionHashes (numOfHashes * 32 + numOfHashes)
// OnionBlog // OnionBlog
err := readElements(r, err := readElements(r,
&c.ChannelPoint, &c.ChannelPoint,

@ -7,8 +7,8 @@ import (
) )
func TestHTLCAddRequestEncodeDecode(t *testing.T) { func TestHTLCAddRequestEncodeDecode(t *testing.T) {
redemptionHashes := make([][20]byte, 1) redemptionHashes := make([][32]byte, 1)
copy(redemptionHashes[0][:], bytes.Repeat([]byte{0x09}, 20)) redemptionHashes[0] = revHash
// First create a new HTLCAR message. // First create a new HTLCAR message.
addReq := &HTLCAddRequest{ addReq := &HTLCAddRequest{

@ -21,17 +21,18 @@ type HTLCSettleRequest struct {
// HTLCKey denotes the exact HTLC stage within the receiving node's // HTLCKey denotes the exact HTLC stage within the receiving node's
// commitment transaction to be removed. // commitment transaction to be removed.
// TODO(roasbeef): rename to LogIndex
HTLCKey HTLCKey HTLCKey HTLCKey
// RedemptionProofs are the R-value preimages required to fully settle // RedemptionProofs are the R-value preimages required to fully settle
// an HTLC. The number of preimages in the slice will depend on the // an HTLC. The number of preimages in the slice will depend on the
// specific ContractType of the referenced HTLC. // specific ContractType of the referenced HTLC.
RedemptionProofs [][20]byte RedemptionProofs [][32]byte
} }
// NewHTLCSettleRequest returns a new empty HTLCSettleRequest. // NewHTLCSettleRequest returns a new empty HTLCSettleRequest.
func NewHTLCSettleRequest(chanPoint *wire.OutPoint, key HTLCKey, func NewHTLCSettleRequest(chanPoint *wire.OutPoint, key HTLCKey,
redemptionProofs [][20]byte) *HTLCSettleRequest { redemptionProofs [][32]byte) *HTLCSettleRequest {
return &HTLCSettleRequest{ return &HTLCSettleRequest{
ChannelPoint: chanPoint, ChannelPoint: chanPoint,
@ -51,7 +52,7 @@ var _ Message = (*HTLCSettleRequest)(nil)
func (c *HTLCSettleRequest) Decode(r io.Reader, pver uint32) error { func (c *HTLCSettleRequest) Decode(r io.Reader, pver uint32) error {
// ChannelPoint(8) // ChannelPoint(8)
// HTLCKey(8) // HTLCKey(8)
// RedemptionProofs(N*20) // RedemptionProofs(N*32)
err := readElements(r, err := readElements(r,
&c.ChannelPoint, &c.ChannelPoint,
&c.HTLCKey, &c.HTLCKey,
@ -94,8 +95,8 @@ func (c *HTLCSettleRequest) Command() uint32 {
// //
// This is part of the lnwire.Message interface. // This is part of the lnwire.Message interface.
func (c *HTLCSettleRequest) MaxPayloadLength(uint32) uint32 { func (c *HTLCSettleRequest) MaxPayloadLength(uint32) uint32 {
// 36 + 8 + (21 * 15) // 36 + 8 + (32 * 15)
return 359 return 524
} }
// Validate performs any necessary sanity checks to ensure all fields present // Validate performs any necessary sanity checks to ensure all fields present

@ -7,8 +7,8 @@ import (
) )
func TestHTLCSettleRequestEncodeDecode(t *testing.T) { func TestHTLCSettleRequestEncodeDecode(t *testing.T) {
redemptionProofs := make([][20]byte, 1) redemptionProofs := make([][32]byte, 1)
copy(redemptionProofs[0][:], bytes.Repeat([]byte{0x09}, 20)) redemptionProofs[0] = revHash
// First create a new HTLCSR message. // First create a new HTLCSR message.
settleReq := NewHTLCSettleRequest(outpoint1, HTLCKey(23), redemptionProofs) settleReq := NewHTLCSettleRequest(outpoint1, HTLCKey(23), redemptionProofs)

@ -169,7 +169,7 @@ func writeElement(w io.Writer, element interface{}) error {
if _, err := w.Write(e[:]); err != nil { if _, err := w.Write(e[:]); err != nil {
return err return err
} }
case [][20]byte: case [][32]byte:
// First write out the number of elements in the slice. // First write out the number of elements in the slice.
sliceSize := len(e) sliceSize := len(e)
if err := writeElement(w, uint16(sliceSize)); err != nil { if err := writeElement(w, uint16(sliceSize)); err != nil {
@ -182,7 +182,7 @@ func writeElement(w io.Writer, element interface{}) error {
return err return err
} }
} }
case [20]byte: case [32]byte:
// TODO(roasbeef): should be factor out to caller logic... // TODO(roasbeef): should be factor out to caller logic...
if _, err := w.Write(e[:]); err != nil { if _, err := w.Write(e[:]); err != nil {
return err return err
@ -408,7 +408,7 @@ func readElement(r io.Reader, element interface{}) error {
return err return err
} }
*e = sig *e = sig
case *[][20]byte: case *[][32]byte:
// How many to read // How many to read
var sliceSize uint16 var sliceSize uint16
err = readElement(r, &sliceSize) err = readElement(r, &sliceSize)
@ -416,10 +416,10 @@ func readElement(r io.Reader, element interface{}) error {
return err return err
} }
data := make([][20]byte, 0, sliceSize) data := make([][32]byte, 0, sliceSize)
// Append the actual // Append the actual
for i := uint16(0); i < sliceSize; i++ { for i := uint16(0); i < sliceSize; i++ {
var element [20]byte var element [32]byte
err = readElement(r, &element) err = readElement(r, &element)
if err != nil { if err != nil {
return err return err
@ -427,7 +427,7 @@ func readElement(r io.Reader, element interface{}) error {
data = append(data, element) data = append(data, element)
} }
*e = data *e = data
case *[20]byte: case *[32]byte:
if _, err = io.ReadFull(r, e[:]); err != nil { if _, err = io.ReadFull(r, e[:]); err != nil {
return err return err
} }

@ -15,6 +15,13 @@ import (
// Common variables and functions for the message tests // Common variables and functions for the message tests
var ( var (
revHash = [32]byte{
0xb7, 0x94, 0x38, 0x5f, 0x2d, 0x1e, 0xf7, 0xab,
0x4d, 0x92, 0x73, 0xd1, 0x90, 0x63, 0x81, 0xb4,
0x4f, 0x2f, 0x6f, 0x25, 0x88, 0xa3, 0xef, 0xb9,
0x6a, 0x49, 0x18, 0x83, 0x31, 0x98, 0x47, 0x53,
}
// For debugging, writes to /dev/shm/ // For debugging, writes to /dev/shm/
// Maybe in the future do it if you do "go test -v" // Maybe in the future do it if you do "go test -v"
WRITE_FILE = false WRITE_FILE = false