OSDN Git Service

modify bytomcli reset-key-password response
[bytom/bytom-spv.git] / api / message.go
1 package api
2
3 import (
4         "context"
5         "encoding/hex"
6         "strings"
7
8         "github.com/bytom/blockchain/signers"
9         "github.com/bytom/common"
10         "github.com/bytom/consensus"
11         "github.com/bytom/crypto"
12         "github.com/bytom/crypto/ed25519"
13         "github.com/bytom/crypto/ed25519/chainkd"
14 )
15
16 // SignMsgResp is response for sign message
17 type SignMsgResp struct {
18         Signature   string       `json:"signature"`
19         DerivedXPub chainkd.XPub `json:"derived_xpub"`
20 }
21
22 func (a *API) signMessage(ctx context.Context, ins struct {
23         Address  string `json:"address"`
24         Message  string `json:"message"`
25         Password string `json:"password"`
26 }) Response {
27         cp, err := a.wallet.AccountMgr.GetProgramByAddress(ins.Address)
28         if err != nil {
29                 return NewErrorResponse(err)
30         }
31
32         account, err := a.wallet.AccountMgr.GetAccountByProgram(cp)
33         if err != nil {
34                 return NewErrorResponse(err)
35         }
36
37         path := signers.Path(account.Signer, signers.AccountKeySpace, cp.KeyIndex)
38         derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
39
40         sig, err := a.wallet.Hsm.XSign(account.XPubs[0], path, []byte(ins.Message), ins.Password)
41         if err != nil {
42                 return NewErrorResponse(err)
43         }
44         return NewSuccessResponse(SignMsgResp{
45                 Signature:   hex.EncodeToString(sig),
46                 DerivedXPub: derivedXPubs[0],
47         })
48 }
49
50 // VerifyMsgResp is response for verify message
51 type VerifyMsgResp struct {
52         VerifyResult bool `json:"result"`
53 }
54
55 func (a *API) verifyMessage(ctx context.Context, ins struct {
56         Address     string       `json:"address"`
57         DerivedXPub chainkd.XPub `json:"derived_xpub"`
58         Message     string       `json:"message"`
59         Signature   string       `json:"signature"`
60 }) Response {
61         sig, err := hex.DecodeString(ins.Signature)
62         if err != nil {
63                 return NewErrorResponse(err)
64         }
65
66         derivedPK := ins.DerivedXPub.PublicKey()
67         pubHash := crypto.Ripemd160(derivedPK)
68         addressPubHash, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
69         if err != nil {
70                 return NewErrorResponse(err)
71         }
72
73         address := addressPubHash.EncodeAddress()
74         if address != strings.TrimSpace(ins.Address) {
75                 return NewSuccessResponse(VerifyMsgResp{VerifyResult: false})
76         }
77
78         if ed25519.Verify(ins.DerivedXPub.PublicKey(), []byte(ins.Message), sig) {
79                 return NewSuccessResponse(VerifyMsgResp{VerifyResult: true})
80         }
81         return NewSuccessResponse(VerifyMsgResp{VerifyResult: false})
82 }