/ input / signdescriptor_test.go
signdescriptor_test.go
  1  package input
  2  
  3  import (
  4  	"bytes"
  5  	"reflect"
  6  	"testing"
  7  
  8  	"github.com/btcsuite/btcd/btcec/v2"
  9  	"github.com/btcsuite/btcd/txscript"
 10  	"github.com/btcsuite/btcd/wire"
 11  	"github.com/lightningnetwork/lnd/keychain"
 12  )
 13  
 14  func TestSignDescriptorSerialization(t *testing.T) {
 15  	keys := [][]byte{
 16  		{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,
 17  			0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,
 18  			0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,
 19  			0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,
 20  			0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,
 21  			0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,
 22  			0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,
 23  			0xb4, 0x12, 0xa3,
 24  		},
 25  		{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,
 26  			0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,
 27  			0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,
 28  			0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,
 29  			0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,
 30  			0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,
 31  			0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,
 32  			0xb4, 0x12, 0xa3,
 33  		},
 34  	}
 35  
 36  	signDescriptors := []SignDescriptor{
 37  		{
 38  			SingleTweak: []byte{
 39  				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 40  				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 41  				0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 42  				0x02, 0x02, 0x02, 0x02, 0x02,
 43  			},
 44  			WitnessScript: []byte{
 45  				0x00, 0x14, 0xee, 0x91, 0x41, 0x7e, 0x85, 0x6c, 0xde,
 46  				0x10, 0xa2, 0x91, 0x1e, 0xdc, 0xbd, 0xbd, 0x69, 0xe2,
 47  				0xef, 0xb5, 0x71, 0x48,
 48  			},
 49  			Output: &wire.TxOut{
 50  				Value: 5000000000,
 51  				PkScript: []byte{
 52  					0x41, // OP_DATA_65
 53  					0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,
 54  					0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,
 55  					0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,
 56  					0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,
 57  					0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,
 58  					0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,
 59  					0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,
 60  					0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,
 61  					0xa6, // 65-byte signature
 62  					0xac, // OP_CHECKSIG
 63  				},
 64  			},
 65  			HashType: txscript.SigHashAll,
 66  		},
 67  
 68  		// Test serializing a SignDescriptor with a nil-valued PrivateTweak
 69  		{
 70  			SingleTweak: nil,
 71  			WitnessScript: []byte{
 72  				0x00, 0x14, 0xee, 0x91, 0x41, 0x7e, 0x85, 0x6c, 0xde,
 73  				0x10, 0xa2, 0x91, 0x1e, 0xdc, 0xbd, 0xbd, 0x69, 0xe2,
 74  				0xef, 0xb5, 0x71, 0x48,
 75  			},
 76  			Output: &wire.TxOut{
 77  				Value: 5000000000,
 78  				PkScript: []byte{
 79  					0x41, // OP_DATA_65
 80  					0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,
 81  					0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,
 82  					0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,
 83  					0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,
 84  					0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,
 85  					0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,
 86  					0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,
 87  					0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,
 88  					0xa6, // 65-byte signature
 89  					0xac, // OP_CHECKSIG
 90  				},
 91  			},
 92  			HashType: txscript.SigHashAll,
 93  		},
 94  	}
 95  
 96  	for i := 0; i < len(signDescriptors); i++ {
 97  		// Parse pubkeys for each sign descriptor.
 98  		sd := &signDescriptors[i]
 99  		pubkey, err := btcec.ParsePubKey(keys[i])
100  		if err != nil {
101  			t.Fatalf("unable to parse pubkey: %v", err)
102  		}
103  		sd.KeyDesc = keychain.KeyDescriptor{
104  			KeyLocator: keychain.KeyLocator{
105  				Family: 50,
106  				Index:  99,
107  			},
108  			PubKey: pubkey,
109  		}
110  
111  		// Test that serialize -> deserialize yields same result as original.
112  		var buf bytes.Buffer
113  		if err := WriteSignDescriptor(&buf, sd); err != nil {
114  			t.Fatalf("unable to serialize sign descriptor[%v]: %v", i, sd)
115  		}
116  
117  		desSd := &SignDescriptor{}
118  		if err := ReadSignDescriptor(&buf, desSd); err != nil {
119  			t.Fatalf("unable to deserialize sign descriptor[%v]: %v", i, sd)
120  		}
121  
122  		if !reflect.DeepEqual(sd, desSd) {
123  			t.Fatalf("original and deserialized sign descriptors not equal:\n"+
124  				"original     : %+v\n"+
125  				"deserialized : %+v\n",
126  				sd, desSd)
127  		}
128  	}
129  }