59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package chainhashw
|
|
|
|
// This package adds some methods on top of chainhash. It's written to be both compatible and
|
|
// similar in implementation, so it's easy to swap out in the future.
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/sha256"
|
|
|
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
|
)
|
|
|
|
var knownTagPrefix = map[string][]byte{}
|
|
|
|
const (
|
|
TagTapLeaf = "TapLeaf"
|
|
TagTapBranch = "TapBranch"
|
|
TagTapTweak = "TapTweak"
|
|
TagTapSighash = "TapSighash"
|
|
)
|
|
|
|
func init() {
|
|
knownTagPrefix[TagTapLeaf] = calcTagPrefix(TagTapLeaf)
|
|
knownTagPrefix[TagTapBranch] = calcTagPrefix(TagTapBranch)
|
|
knownTagPrefix[TagTapTweak] = calcTagPrefix(TagTapTweak)
|
|
knownTagPrefix[TagTapSighash] = calcTagPrefix(TagTapSighash)
|
|
}
|
|
|
|
func TagPrefix(tag string) []byte {
|
|
if prefix, ok := knownTagPrefix[tag]; ok {
|
|
return prefix
|
|
}
|
|
|
|
return calcTagPrefix(tag)
|
|
}
|
|
|
|
func TaggedHashB(tag string, data []byte) []byte {
|
|
// NOTE: BIP-340 suggests optimizations that we don't make
|
|
b := new(bytes.Buffer)
|
|
b.Write(TagPrefix(tag))
|
|
b.Write(data)
|
|
|
|
return chainhash.HashB(b.Bytes())
|
|
}
|
|
|
|
func TaggedHashH(tag string, data []byte) chainhash.Hash {
|
|
// NOTE: BIP-340 suggests optimizations that we don't make
|
|
b := new(bytes.Buffer)
|
|
b.Write(TagPrefix(tag))
|
|
b.Write(data)
|
|
|
|
return chainhash.HashH(b.Bytes())
|
|
}
|
|
|
|
func calcTagPrefix(tag string) []byte {
|
|
tagHash := sha256.Sum256([]byte(tag))
|
|
return append(tagHash[:], tagHash[:]...)
|
|
}
|