Skip to content

Commit ab1c81a

Browse files
committed
firmware/btc: return struct in BTCSign and BTCSignMessage
Better clarity and composes better with generic functions returning a single value.
1 parent 0bc64fb commit ab1c81a

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

api/firmware/btc.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -542,18 +542,27 @@ func (device *Device) BTCRegisterScriptConfig(
542542
return nil
543543
}
544544

545+
type BTCSignMessageResult struct {
546+
// Signature is the 64 byte raw signature.
547+
Signature []byte
548+
// RecID is the recoverable ID.
549+
RecID byte
550+
// ElectrumSig65 is the 65 byte signature in Electrum format.
551+
ElectrumSig65 []byte
552+
}
553+
545554
// BTCSignMessage signs a Bitcoin message. The 64 byte raw signature, the recoverable ID and the 65
546555
// byte signature in Electrum format are returned.
547556
func (device *Device) BTCSignMessage(
548557
coin messages.BTCCoin,
549558
scriptConfig *messages.BTCScriptConfigWithKeypath,
550559
message []byte,
551-
) (raw []byte, recID byte, electrum65 []byte, err error) {
560+
) (*BTCSignMessageResult, error) {
552561
if isTaproot(scriptConfig) {
553-
return nil, 0, nil, errp.New("taproot not supported")
562+
return nil, errp.New("taproot not supported")
554563
}
555564
if !device.version.AtLeast(semver.NewSemVer(9, 2, 0)) {
556-
return nil, 0, nil, UnsupportedError("9.2.0")
565+
return nil, UnsupportedError("9.2.0")
557566
}
558567

559568
supportsAntiklepto := device.version.AtLeast(semver.NewSemVer(9, 5, 0))
@@ -564,7 +573,7 @@ func (device *Device) BTCSignMessage(
564573
var err error
565574
hostNonce, err = generateHostNonce()
566575
if err != nil {
567-
return nil, 0, nil, err
576+
return nil, err
568577
}
569578
hostNonceCommitment = &messages.AntiKleptoHostNonceCommitment{
570579
Commitment: antikleptoHostCommit(hostNonce),
@@ -583,14 +592,14 @@ func (device *Device) BTCSignMessage(
583592
}
584593
response, err := device.queryBTC(request)
585594
if err != nil {
586-
return nil, 0, nil, err
595+
return nil, err
587596
}
588597

589598
var signature []byte
590599
if supportsAntiklepto {
591600
signerCommitment, ok := response.Response.(*messages.BTCResponse_AntikleptoSignerCommitment)
592601
if !ok {
593-
return nil, 0, nil, errp.New("unexpected response")
602+
return nil, errp.New("unexpected response")
594603
}
595604
response, err := device.queryBTC(&messages.BTCRequest{
596605
Request: &messages.BTCRequest_AntikleptoSignature{
@@ -600,12 +609,12 @@ func (device *Device) BTCSignMessage(
600609
},
601610
})
602611
if err != nil {
603-
return nil, 0, nil, err
612+
return nil, err
604613
}
605614

606615
signResponse, ok := response.Response.(*messages.BTCResponse_SignMessage)
607616
if !ok {
608-
return nil, 0, nil, errp.New("unexpected response")
617+
return nil, errp.New("unexpected response")
609618
}
610619
signature = signResponse.SignMessage.Signature
611620
err = antikleptoVerify(
@@ -614,12 +623,12 @@ func (device *Device) BTCSignMessage(
614623
signature[:64],
615624
)
616625
if err != nil {
617-
return nil, 0, nil, err
626+
return nil, err
618627
}
619628
} else {
620629
signResponse, ok := response.Response.(*messages.BTCResponse_SignMessage)
621630
if !ok {
622-
return nil, 0, nil, errp.New("unexpected response")
631+
return nil, errp.New("unexpected response")
623632
}
624633
signature = signResponse.SignMessage.Signature
625634
}
@@ -628,5 +637,9 @@ func (device *Device) BTCSignMessage(
628637
// See https://github.com/spesmilo/electrum/blob/84dc181b6e7bb20e88ef6b98fb8925c5f645a765/electrum/ecc.py#L521-L523
629638
const compressed = 4 // BitBox02 uses only compressed pubkeys
630639
electrumSig65 := append([]byte{27 + compressed + recID}, sig...)
631-
return sig, recID, electrumSig65, nil
640+
return &BTCSignMessageResult{
641+
Signature: sig,
642+
RecID: recID,
643+
ElectrumSig65: electrumSig65,
644+
}, nil
632645
}

api/firmware/btc_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func TestSimulatorBTCSignMessage(t *testing.T) {
161161

162162
pubKey := simulatorPub(t, device, keypath...)
163163

164-
sig, _, _, err := device.BTCSignMessage(
164+
result, err := device.BTCSignMessage(
165165
coin,
166166
&messages.BTCScriptConfigWithKeypath{
167167
ScriptConfig: NewBTCScriptConfigSimple(messages.BTCScriptConfig_P2WPKH_P2SH),
@@ -171,7 +171,7 @@ func TestSimulatorBTCSignMessage(t *testing.T) {
171171
)
172172
require.NoError(t, err)
173173
sigHash := chainhash.DoubleHashB([]byte("\x18Bitcoin Signed Message:\n\x07message"))
174-
require.True(t, parseECDSASignature(t, sig).Verify(sigHash, pubKey))
174+
require.True(t, parseECDSASignature(t, result.Signature).Verify(sigHash, pubKey))
175175
})
176176
}
177177

@@ -352,7 +352,7 @@ func TestBTCSignMessage(t *testing.T) {
352352
generateHostNonce = func() ([]byte, error) {
353353
return hostNonce, nil
354354
}
355-
sig, recID, electrumSig65, err := env.device.BTCSignMessage(
355+
result, err := env.device.BTCSignMessage(
356356
messages.BTCCoin_BTC,
357357
&messages.BTCScriptConfigWithKeypath{
358358
ScriptConfig: NewBTCScriptConfigSimple(messages.BTCScriptConfig_P2WPKH_P2SH),
@@ -362,9 +362,9 @@ func TestBTCSignMessage(t *testing.T) {
362362
)
363363
if env.version.AtLeast(semver.NewSemVer(9, 2, 0)) {
364364
require.NoError(t, err)
365-
require.Equal(t, expectedSig[:64], sig)
366-
require.Equal(t, byte(0), recID)
367-
require.Equal(t, electrumSig65, append([]byte{31}, expectedSig[:64]...))
365+
require.Equal(t, expectedSig[:64], result.Signature)
366+
require.Equal(t, byte(0), result.RecID)
367+
require.Equal(t, result.ElectrumSig65, append([]byte{31}, expectedSig[:64]...))
368368
} else {
369369
require.EqualError(t, err, UnsupportedError("9.2.0").Error())
370370
}

0 commit comments

Comments
 (0)