func dump_sigscript(d []byte) bool { if len(d) < 10+34 { // at least 10 bytes for sig and 34 bytes key fmt.Println(" WARNING: Short sigScript") fmt.Print(hex_dump(d)) return false } rd := bytes.NewReader(d) // ECDSA Signature le, _ := rd.ReadByte() if le < 0x40 { return dump_raw_sigscript(d) } sd := make([]byte, le) _, er := rd.Read(sd) if er != nil { return dump_raw_sigscript(d) } sig, er := btc.NewSignature(sd) if er != nil { return dump_raw_sigscript(d) } fmt.Printf(" R = %64s\n", hex.EncodeToString(sig.R.Bytes())) fmt.Printf(" S = %64s\n", hex.EncodeToString(sig.S.Bytes())) fmt.Printf(" HashType = %02x\n", sig.HashType) // Key le, er = rd.ReadByte() if er != nil { fmt.Println(" WARNING: PublicKey not present") fmt.Print(hex_dump(d)) return false } sd = make([]byte, le) _, er = rd.Read(sd) if er != nil { fmt.Println(" WARNING: PublicKey too short", er.Error()) fmt.Print(hex_dump(d)) return false } fmt.Printf(" PublicKeyType = %02x\n", sd[0]) key, er := btc.NewPublicKey(sd) if er != nil { fmt.Println(" WARNING: PublicKey broken", er.Error()) fmt.Print(hex_dump(d)) return false } fmt.Printf(" X = %64s\n", key.X.String()) if le >= 65 { fmt.Printf(" Y = %64s\n", key.Y.String()) } if rd.Len() != 0 { fmt.Println(" WARNING: Extra bytes at the end of sigScript") fmt.Print(hex_dump(d[len(d)-rd.Len():])) } return true }
func IsLowS(sig []byte) bool { if !IsValidSignatureEncoding(sig) { return false } ss, e := btc.NewSignature(sig) if e != nil { return false } return ss.IsLowS() }