func testSignCompact(t *testing.T, tag string, curve *btcec.KoblitzCurve, data []byte, isCompressed bool) { tmp, _ := btcec.NewPrivateKey(curve) priv := (*btcec.PrivateKey)(tmp) hashed := []byte("testing") sig, err := btcec.SignCompact(curve, priv, hashed, isCompressed) if err != nil { t.Errorf("%s: error signing: %s", tag, err) return } pk, wasCompressed, err := btcec.RecoverCompact(curve, sig, hashed) if err != nil { t.Errorf("%s: error recovering: %s", tag, err) return } if pk.X.Cmp(priv.X) != 0 || pk.Y.Cmp(priv.Y) != 0 { t.Errorf("%s: recovered pubkey doesn't match original "+ "(%v,%v) vs (%v,%v) ", tag, pk.X, pk.Y, priv.X, priv.Y) return } if wasCompressed != isCompressed { t.Errorf("%s: recovered pubkey doesn't match compressed state "+ "(%v vs %v)", tag, isCompressed, wasCompressed) return } // If we change the compressed bit we should get the same key back, // but the compressed flag should be reversed. if isCompressed { sig[0] -= 4 } else { sig[0] += 4 } pk, wasCompressed, err = btcec.RecoverCompact(curve, sig, hashed) if err != nil { t.Errorf("%s: error recovering (2): %s", tag, err) return } if pk.X.Cmp(priv.X) != 0 || pk.Y.Cmp(priv.Y) != 0 { t.Errorf("%s: recovered pubkey (2) doesn't match original "+ "(%v,%v) vs (%v,%v) ", tag, pk.X, pk.Y, priv.X, priv.Y) return } if wasCompressed == isCompressed { t.Errorf("%s: recovered pubkey doesn't match reversed "+ "compressed state (%v vs %v)", tag, isCompressed, wasCompressed) return } }
//SignMessage sign using bitcoin sign struct func (key *Key) SignMessage(hash []byte) ([]byte, error) { msg := make([]byte, 0) msg = append(msg, []byte("\x18Bitcoin Signed Message:\n")...) msg = append(msg, []byte{byte(len(hash))}...) msg = append(msg, hash...) h := sha256.Sum256(msg) hh := sha256.Sum256(h[:]) s256 := btcec.S256() sig, err := btcec.SignCompact(s256, key.Priv.key, hh[:], key.Pub.isCompressed) if err != nil { return nil, err } return sig, nil }