Skip to content

Commit 4bd42d1

Browse files
author
shadowy-pycoder
committed
Removed taproot headers
1 parent 51c60bd commit 4bd42d1

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

bmt/main.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,12 @@ Taproot Address: bc1p5utaw0g77graev5yw575c3jnzh8j88ezzw39lgr250ghppwpyccsvjkvyp
141141
GenPoint = NewJacobianPoint(genPointX, genPointY, one)
142142
precomputes = getPrecomputes()
143143
IdentityPoint = NewJacobianPoint(zero, zero, zero)
144-
addressTypes = []string{"legacy", "nested", "segwit"}
145-
headers = [5][4]byte{
144+
addressTypes = []string{"legacy", "nested", "segwit", "taproot"}
145+
headers = [4][4]byte{
146146
{0x1b, 0x1c, 0x1d, 0x1e}, // 27 - 30 P2PKH uncompressed
147147
{0x1f, 0x20, 0x21, 0x22}, // 31 - 34 P2PKH compressed
148148
{0x23, 0x24, 0x25, 0x26}, // 35 - 38 P2WPKH-P2SH compressed (BIP-137)
149149
{0x27, 0x28, 0x29, 0x2a}, // 39 - 42 P2WPKH compressed (BIP-137)
150-
{0x2b, 0x2c, 0x2d, 0x2e}, // TODO 43 - 46 P2TR
151150
}
152151
pool = sync.Pool{
153152
New: func() any {
@@ -511,7 +510,6 @@ func generate(scalar *ModNScalar) {
511510
}
512511
scalar.Zero()
513512
}
514-
515513
}
516514

517515
// NewPrivateKey generates a new privatekey object.
@@ -868,7 +866,6 @@ func DoubleSHA256(b []byte) []byte {
868866
panic(err)
869867
}
870868
return h2.Sum(nil)
871-
872869
}
873870

874871
// Ripemd160SHA256 computes the RIPEMD160 hash of the SHA-256 hash of the input byte slice.
@@ -1266,11 +1263,11 @@ func rfcSign(msg []byte, privKey *ModNScalar) *Signature {
12661263
//
12671264
// Parameters:
12681265
// - pubKey: a byte slice representing the public key.
1269-
// - addrType: a string representing the address type. Valid values are "legacy", "nested", and "segwit".
1266+
// - addrType: a string representing the address type. Valid values are "legacy", "nested", "segwit" and "taproot".
12701267
//
12711268
// Returns:
12721269
// - a string representing the Bitcoin address.
1273-
// - an integer representing the address type. 0 for legacy, 1 for nested, and 2 for segwit.
1270+
// - an integer representing the address type.
12741271
// - an error if the address type is invalid.
12751272
func deriveAddress(pubKey []byte, addrType string) (addr string, ver int, err error) {
12761273
prefix := pubKey[0]
@@ -1289,6 +1286,9 @@ func deriveAddress(pubKey []byte, addrType string) (addr string, ver int, err er
12891286
if addrType == "segwit" {
12901287
return createNativeSegwit(pubKey), 3, nil
12911288
}
1289+
if addrType == "taproot" {
1290+
return createTaproot(pubKey), 4, nil
1291+
}
12921292
return "", 0, &SignatureError{Message: "invalid address type"}
12931293

12941294
}
@@ -1304,7 +1304,7 @@ func deriveAddress(pubKey []byte, addrType string) (addr string, ver int, err er
13041304
// - s: a pointer to a ModNScalar representing the s value of the signature.
13051305
func splitSignature(sig []byte) (byte, *ModNScalar, *ModNScalar, error) {
13061306
header := sig[0]
1307-
if header < headers[0][0] || header > headers[4][3] {
1307+
if header < headers[0][0] || header > headers[3][3] {
13081308
return 0, nil, nil, &SignatureError{Message: "header byte out of range"}
13091309
}
13101310
var (
@@ -1323,17 +1323,17 @@ func splitSignature(sig []byte) (byte, *ModNScalar, *ModNScalar, error) {
13231323
return header, &r, &s, nil
13241324
}
13251325

1326-
// VerifyMessage verifies a signed message using the provided address, message, signature, and electrum flag.
1326+
// VerifyMessage verifies a signed message.
13271327
//
13281328
// Parameters:
1329-
// - address: the address used to sign the message.
1330-
// - message: the message to be verified.
1331-
// - signature: the signature to verify the message.
1329+
// - message (*BitcoinMessage): The signed message to verify.
13321330
// - electrum: a flag indicating whether to use the electrum signature format.
13331331
//
13341332
// Returns:
13351333
// - a pointer to a VerifyMessageResult struct containing the verification result and the hex-encoded public key.
13361334
// - error: an error if any occurred during the verification process.
1335+
//
1336+
// https://github.com/bitcoin/bips/blob/master/bip-0137.mediawiki
13371337
func VerifyMessage(message *BitcoinMessage, electrum bool) (*VerifyMessageResult, error) {
13381338
dsig := make([]byte, base64.StdEncoding.DecodedLen(len(message.signature)))
13391339
n, err := base64.StdEncoding.Decode(dsig, message.signature)
@@ -1349,10 +1349,7 @@ func VerifyMessage(message *BitcoinMessage, electrum bool) (*VerifyMessageResult
13491349
}
13501350
uncompressed := false
13511351
addrType := "legacy"
1352-
if header >= 43 {
1353-
header -= 16
1354-
addrType = ""
1355-
} else if header >= 39 {
1352+
if header >= 39 {
13561353
header -= 12
13571354
addrType = "segwit"
13581355
} else if header >= 35 {
@@ -1414,9 +1411,6 @@ func VerifyMessage(message *BitcoinMessage, electrum bool) (*VerifyMessageResult
14141411
PubKey: hex.EncodeToString(pubKey),
14151412
Message: "message failed to verify"}, nil
14161413
}
1417-
if addrType == "" {
1418-
return nil, &SignatureError{Message: "unknown address type"}
1419-
}
14201414
addr, _, err := deriveAddress(pubKey, addrType)
14211415
if err != nil {
14221416
return nil, err
@@ -1450,6 +1444,8 @@ func VerifyMessage(message *BitcoinMessage, electrum bool) (*VerifyMessageResult
14501444
// Returns:
14511445
// - A pointer to a BitcoinMessage struct representing the signed message.
14521446
// - An error if there was a problem signing the message.
1447+
//
1448+
// https://github.com/bitcoin/bips/blob/master/bip-0137.mediawiki
14531449
func SignMessage(pk *privatekey, addrType, message string, deterministic, electrum bool) (*BitcoinMessage, error) {
14541450
var (
14551451
sig *Signature

bmt/main_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -933,13 +933,13 @@ func TestVerifyMessageErr(t *testing.T) {
933933
errMsg: "s-value out of range",
934934
},
935935
{
936-
name: "invalid signature: signature R + N >= P",
936+
name: "header byte out of range",
937937
message: &BitcoinMessage{
938938
address: "1JeARtmwjd8smhvVcS7PW9dG7rhDXJZ4ao",
939939
payload: Message,
940940
signature: []byte("LgM/bGa3Vl4lZF+G12+gMMw9AeowJq0+UHMW557DuP3LcVafaeiX91w6u1/aj9TNj6/3GkHsqYtMl2X40YHL/qQ=")},
941941
electrum: false,
942-
errMsg: "invalid signature: signature R + N >= P",
942+
errMsg: "header byte out of range",
943943
},
944944
}
945945
for _, testcase := range testcases {

0 commit comments

Comments
 (0)