github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/sig64/sigcompress_test.go (about)

     1  package sig64
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"testing"
     7  
     8  	"github.com/mit-dci/lit/btcutil/chaincfg/chainhash"
     9  	"github.com/mit-dci/lit/btcutil/txscript"
    10  	"github.com/mit-dci/lit/crypto/koblitz"
    11  	"github.com/mit-dci/lit/wire"
    12  )
    13  
    14  var (
    15  	sig1big, _ = hex.DecodeString("304402206048246c95429555d265472d936b71e728f468a84412f9423941b4b9cbbab2f002204eb1bf82879c72adc3390a638a221792adecf74a097de9bd1257b5bc3e17a407")
    16  	sig2big, _ = hex.DecodeString("3045022100b88e7a9137efe437cae4f3dd5e0d05bdf9cf519c10c36d2f657d6bbb0906a50f022041c95b40dc5423864022f5d110a810c50c1dd72c4b679da75e0134f4f5903609")
    17  	sig3big, _ = hex.DecodeString("3045022059f28edc62e4b744ff7097717b7d4701614e4af6a30dfa2081ef3e8e279241840221008279ca7eb40a4bd04c923b96110b00d472d648c67df09ad39945130b8f7e4dc8")
    18  )
    19  
    20  // TestRandom makes random signatures and compresses / decompresses them
    21  func TestRandom(t *testing.T) {
    22  	for i := 0; i < 8; i++ {
    23  		priv, _ := koblitz.NewPrivateKey(koblitz.S256())
    24  		sig, err := priv.Sign(chainhash.DoubleHashB([]byte{byte(i)}))
    25  		if err != nil {
    26  			t.Fatal(err)
    27  		}
    28  		bigsig := sig.Serialize()
    29  		lilsig, err := SigCompress(bigsig)
    30  		if err != nil {
    31  			t.Fatal(err)
    32  		}
    33  		decsig := SigDecompress(lilsig)
    34  		if !bytes.Equal(bigsig, decsig) {
    35  			t.Fatalf("big/recover/comp:\n%x\n%x\n%x\n", bigsig, decsig, lilsig)
    36  
    37  		}
    38  		t.Logf("big/recover:\n%x\n%x\n", bigsig, decsig)
    39  
    40  	}
    41  }
    42  
    43  // TestHardCoded tries compressing / decompressing hardcoded sigs
    44  func TestHardCoded(t *testing.T) {
    45  	c1, err := SigCompress(sig1big)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  	t.Logf("big1:\n%x\ncom1:\n%x\n", sig1big, c1)
    50  
    51  	c2, err := SigCompress(sig2big)
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  	t.Logf("big2:\n%x\ncom2:\n%x\n", sig2big, c2)
    56  
    57  	c3, err := SigCompress(sig3big)
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  	t.Logf("big3:\n%x\ncom3:\n%x\n", sig3big, c3)
    62  
    63  	r1 := SigDecompress(c1)
    64  	t.Logf("dec1:\n%x\n", r1)
    65  
    66  	r2 := SigDecompress(c2)
    67  	t.Logf("dec1:\n%x\n", r2)
    68  
    69  	r3 := SigDecompress(c3)
    70  	t.Logf("dec1:\n%x\n", r3)
    71  
    72  }
    73  
    74  // TestShortSignature is short signature case
    75  func TestShortSignature(t *testing.T) {
    76  	tx := wire.NewMsgTx()
    77  	hash, _ := chainhash.NewHashFromStr("000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f")
    78  	op := wire.NewOutPoint(hash, 0)
    79  	txin := wire.NewTxIn(op, nil, nil)
    80  	tx.AddTxIn(txin)
    81  	pkScript := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}
    82  	txout := wire.NewTxOut(100000000, pkScript)
    83  	tx.AddTxOut(txout)
    84  	sigHashes := txscript.NewTxSigHashes(tx)
    85  	idx := 0
    86  	subScript := []byte{0x14, 0x98, 0x97, 0xfd, 0x2b, 0x98, 0x0f, 0xec, 0xca, 0xeb, 0x9c, 0x63, 0xc2, 0x74, 0x9b, 0x38, 0x9c, 0x77, 0x2a, 0x9d, 0x75}
    87  	amt := int64(100001000)
    88  	hashType := txscript.SigHashAll
    89  	key, _ := koblitz.PrivKeyFromBytes(koblitz.S256(), []byte("privatekey"))
    90  	sign, err := txscript.RawTxInWitnessSignature(tx, sigHashes, idx, amt, subScript, hashType, key)
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	sign = sign[:len(sign)-1]
    95  	t.Logf("sign:%x", sign)
    96  	csig, err := SigCompress(sign)
    97  	if err != nil {
    98  		t.Fatal(err)
    99  	}
   100  	t.Logf("csig:%x", csig)
   101  	dsig := SigDecompress(csig)
   102  	t.Logf("dsig:%x", dsig)
   103  	for i := range dsig {
   104  		if sign[i] != dsig[i] {
   105  			t.Fatalf("unmatch SigCompress/SigDecompress:%x/%x", sign, dsig)
   106  		}
   107  	}
   108  }