OSDN Git Service

make some fields of BlockchainReactor public to facilitate separate API (#477)
[bytom/bytom.git] / blockchain / hsm.go
1 package blockchain
2
3 import (
4         "context"
5
6         log "github.com/sirupsen/logrus"
7
8         "github.com/bytom/blockchain/pseudohsm"
9         "github.com/bytom/blockchain/txbuilder"
10         "github.com/bytom/crypto/ed25519/chainkd"
11         "github.com/bytom/net/http/httperror"
12 )
13
14 func init() {
15         //Error code 050 represents alias of key duplicated
16         errorFormatter.Errors[pseudohsm.ErrDuplicateKeyAlias] = httperror.Info{400, "BTM050", "Alias already exists"}
17         //Error code 801 represents query request format error
18         errorFormatter.Errors[pseudohsm.ErrInvalidAfter] = httperror.Info{400, "BTM801", "Invalid `after` in query"}
19         //Error code 802 represents query reponses too many
20         errorFormatter.Errors[pseudohsm.ErrTooManyAliasesToList] = httperror.Info{400, "BTM802", "Too many aliases to list"}
21 }
22
23 func (a *API) pseudohsmCreateKey(ctx context.Context, in struct {
24         Alias    string `json:"alias"`
25         Password string `json:"password"`
26 }) Response {
27         xpub, err := a.wallet.Hsm.XCreate(in.Alias, in.Password)
28         if err != nil {
29                 return NewErrorResponse(err)
30         }
31         return NewSuccessResponse(xpub)
32 }
33
34 func (a *API) pseudohsmListKeys(ctx context.Context) Response {
35         return NewSuccessResponse(a.wallet.Hsm.ListKeys())
36 }
37
38 func (a *API) pseudohsmDeleteKey(ctx context.Context, x struct {
39         Password string       `json:"password"`
40         XPub     chainkd.XPub `json:"xpub"`
41 }) Response {
42         if err := a.wallet.Hsm.XDelete(x.XPub, x.Password); err != nil {
43                 return NewErrorResponse(err)
44         }
45         return NewSuccessResponse(nil)
46 }
47
48 type signResp struct {
49         Tx           *txbuilder.Template `json:"transaction"`
50         SignComplete bool                `json:"sign_complete"`
51 }
52
53 func (a *API) pseudohsmSignTemplates(ctx context.Context, x struct {
54         Password string             `json:"password"`
55         Txs      txbuilder.Template `json:"transaction"`
56 }) Response {
57         if err := txbuilder.Sign(ctx, &x.Txs, nil, x.Password, a.pseudohsmSignTemplate); err != nil {
58                 log.WithField("build err", err).Error("fail on sign transaction.")
59                 return NewErrorResponse(err)
60         }
61         log.Info("Sign Transaction complete.")
62         return NewSuccessResponse(&signResp{Tx: &x.Txs, SignComplete: txbuilder.SignProgress(&x.Txs)})
63 }
64
65 func (a *API) pseudohsmSignTemplate(ctx context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
66         return a.wallet.Hsm.XSign(xpub, path, data[:], password)
67 }
68
69 type ResetPasswordResp struct {
70         Changed bool `json:"changed"`
71 }
72
73 func (a *API) pseudohsmResetPassword(ctx context.Context, ins struct {
74         XPub        chainkd.XPub `json:"xpub"`
75         OldPassword string       `json:"old_password"`
76         NewPassword string       `json:"new_password"`
77 }) Response {
78         resp := &ResetPasswordResp{Changed: false}
79         if err := a.wallet.Hsm.ResetPassword(ins.XPub, ins.OldPassword, ins.NewPassword); err != nil {
80                 return NewSuccessResponse(resp)
81         }
82         resp.Changed = true
83         return NewSuccessResponse(resp)
84 }