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 }