OSDN Git Service

Merge pull request #375 from Bytom/dev
[bytom/bytom-spv.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 (bcr *BlockchainReactor) pseudohsmCreateKey(ctx context.Context, in struct {
24         Alias    string `json:"alias"`
25         Password string `json:"password"`
26 }) Response {
27         xpub, err := bcr.hsm.XCreate(in.Alias, in.Password)
28         if err != nil {
29                 return NewErrorResponse(err)
30         }
31         return NewSuccessResponse(xpub)
32 }
33
34 func (bcr *BlockchainReactor) pseudohsmListKeys(ctx context.Context) Response {
35         xpubs, err := bcr.hsm.ListKeys()
36         if err != nil {
37                 return NewErrorResponse(err)
38         }
39
40         return NewSuccessResponse(xpubs)
41 }
42
43 func (bcr *BlockchainReactor) pseudohsmDeleteKey(ctx context.Context, x struct {
44         Password string       `json:"password"`
45         XPub     chainkd.XPub `json:"xpubs"`
46 }) Response {
47         if err := bcr.hsm.XDelete(x.XPub, x.Password); err != nil {
48                 return NewErrorResponse(err)
49         }
50         return NewSuccessResponse(nil)
51 }
52
53 func (bcr *BlockchainReactor) 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, bcr.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(&x.Txs)
63 }
64
65 func (bcr *BlockchainReactor) pseudohsmSignTemplate(ctx context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
66         return bcr.hsm.XSign(xpub, path, data[:], password)
67 }
68
69 func (bcr *BlockchainReactor) pseudohsmResetPassword(ctx context.Context, x struct {
70         OldPassword string
71         NewPassword string
72         XPub        chainkd.XPub `json:"xpubs"`
73 }) error {
74         return bcr.hsm.ResetPassword(x.XPub, x.OldPassword, x.NewPassword)
75 }