@@ -542,18 +542,27 @@ func (device *Device) BTCRegisterScriptConfig(
542
542
return nil
543
543
}
544
544
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
+
545
554
// BTCSignMessage signs a Bitcoin message. The 64 byte raw signature, the recoverable ID and the 65
546
555
// byte signature in Electrum format are returned.
547
556
func (device * Device ) BTCSignMessage (
548
557
coin messages.BTCCoin ,
549
558
scriptConfig * messages.BTCScriptConfigWithKeypath ,
550
559
message []byte ,
551
- ) (raw [] byte , recID byte , electrum65 [] byte , err error ) {
560
+ ) (* BTCSignMessageResult , error ) {
552
561
if isTaproot (scriptConfig ) {
553
- return nil , 0 , nil , errp .New ("taproot not supported" )
562
+ return nil , errp .New ("taproot not supported" )
554
563
}
555
564
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" )
557
566
}
558
567
559
568
supportsAntiklepto := device .version .AtLeast (semver .NewSemVer (9 , 5 , 0 ))
@@ -564,7 +573,7 @@ func (device *Device) BTCSignMessage(
564
573
var err error
565
574
hostNonce , err = generateHostNonce ()
566
575
if err != nil {
567
- return nil , 0 , nil , err
576
+ return nil , err
568
577
}
569
578
hostNonceCommitment = & messages.AntiKleptoHostNonceCommitment {
570
579
Commitment : antikleptoHostCommit (hostNonce ),
@@ -583,14 +592,14 @@ func (device *Device) BTCSignMessage(
583
592
}
584
593
response , err := device .queryBTC (request )
585
594
if err != nil {
586
- return nil , 0 , nil , err
595
+ return nil , err
587
596
}
588
597
589
598
var signature []byte
590
599
if supportsAntiklepto {
591
600
signerCommitment , ok := response .Response .(* messages.BTCResponse_AntikleptoSignerCommitment )
592
601
if ! ok {
593
- return nil , 0 , nil , errp .New ("unexpected response" )
602
+ return nil , errp .New ("unexpected response" )
594
603
}
595
604
response , err := device .queryBTC (& messages.BTCRequest {
596
605
Request : & messages.BTCRequest_AntikleptoSignature {
@@ -600,12 +609,12 @@ func (device *Device) BTCSignMessage(
600
609
},
601
610
})
602
611
if err != nil {
603
- return nil , 0 , nil , err
612
+ return nil , err
604
613
}
605
614
606
615
signResponse , ok := response .Response .(* messages.BTCResponse_SignMessage )
607
616
if ! ok {
608
- return nil , 0 , nil , errp .New ("unexpected response" )
617
+ return nil , errp .New ("unexpected response" )
609
618
}
610
619
signature = signResponse .SignMessage .Signature
611
620
err = antikleptoVerify (
@@ -614,12 +623,12 @@ func (device *Device) BTCSignMessage(
614
623
signature [:64 ],
615
624
)
616
625
if err != nil {
617
- return nil , 0 , nil , err
626
+ return nil , err
618
627
}
619
628
} else {
620
629
signResponse , ok := response .Response .(* messages.BTCResponse_SignMessage )
621
630
if ! ok {
622
- return nil , 0 , nil , errp .New ("unexpected response" )
631
+ return nil , errp .New ("unexpected response" )
623
632
}
624
633
signature = signResponse .SignMessage .Signature
625
634
}
@@ -628,5 +637,9 @@ func (device *Device) BTCSignMessage(
628
637
// See https://github.com/spesmilo/electrum/blob/84dc181b6e7bb20e88ef6b98fb8925c5f645a765/electrum/ecc.py#L521-L523
629
638
const compressed = 4 // BitBox02 uses only compressed pubkeys
630
639
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
632
645
}
0 commit comments