+++ /dev/null
-package api
-
-import (
- "context"
-
- log "github.com/sirupsen/logrus"
-
- "github.com/vapor/blockchain/pseudohsm"
- "github.com/vapor/blockchain/txbuilder"
- "github.com/vapor/common"
- "github.com/vapor/consensus"
- "github.com/vapor/crypto"
- "github.com/vapor/crypto/ed25519/chainkd"
-)
-
-type createKeyResp struct {
- Alias string `json:"alias"`
- XPub chainkd.XPub `json:"xpub"`
- File string `json:"file"`
- Mnemonic string `json:"mnemonic,omitempty"`
-}
-
-func (a *API) pseudohsmCreateKey(ctx context.Context, in struct {
- Alias string `json:"alias"`
- Password string `json:"password"`
- Mnemonic string `json:"mnemonic"`
- Language string `json:"language"`
-}) Response {
- if in.Language == "" {
- in.Language = "en"
- }
- if len(in.Mnemonic) > 0 {
- xpub, err := a.wallet.Hsm.ImportKeyFromMnemonic(in.Alias, in.Password, in.Mnemonic, in.Language)
- if err != nil {
- return NewErrorResponse(err)
- }
- return NewSuccessResponse(&createKeyResp{Alias: xpub.Alias, XPub: xpub.XPub, File: xpub.File})
- }
- xpub, mnemonic, err := a.wallet.Hsm.XCreate(in.Alias, in.Password, in.Language)
- if err != nil {
- return NewErrorResponse(err)
- }
- return NewSuccessResponse(&createKeyResp{Alias: xpub.Alias, XPub: xpub.XPub, File: xpub.File, Mnemonic: *mnemonic})
-}
-
-func (a *API) pseudohsmUpdateKeyAlias(ctx context.Context, in struct {
- XPub chainkd.XPub `json:"xpub"`
- NewAlias string `json:"new_alias"`
-}) Response {
- if err := a.wallet.Hsm.UpdateKeyAlias(in.XPub, in.NewAlias); err != nil {
- return NewErrorResponse(err)
- }
- return NewSuccessResponse(nil)
-}
-
-func (a *API) pseudohsmListKeys(ctx context.Context) Response {
- return NewSuccessResponse(a.wallet.Hsm.ListKeys())
-}
-
-func (a *API) pseudohsmDeleteKey(ctx context.Context, x struct {
- Password string `json:"password"`
- XPub chainkd.XPub `json:"xpub"`
-}) Response {
- if err := a.wallet.Hsm.XDelete(x.XPub, x.Password); err != nil {
- return NewErrorResponse(err)
- }
- return NewSuccessResponse(nil)
-}
-
-type signTemplateResp struct {
- Tx *txbuilder.Template `json:"transaction"`
- SignComplete bool `json:"sign_complete"`
-}
-
-func (a *API) signTemplate(ctx context.Context, x struct {
- Password string `json:"password"`
- Txs txbuilder.Template `json:"transaction"`
-}) Response {
- if err := txbuilder.Sign(ctx, &x.Txs, x.Password, a.PseudohsmSignTemplate); err != nil {
- log.WithField("build err", err).Error("fail on sign transaction.")
- return NewErrorResponse(err)
- }
- log.Info("Sign Transaction complete.")
- return NewSuccessResponse(&signTemplateResp{Tx: &x.Txs, SignComplete: txbuilder.SignProgress(&x.Txs)})
-}
-
-func (a *API) signWithPriKey(ins struct {
- Xprv string `json:"xprv"`
- Tx txbuilder.Template `json:"transaction"`
-}) Response {
- xprv := &chainkd.XPrv{}
- if err := xprv.UnmarshalText([]byte(ins.Xprv)); err != nil {
- return NewErrorResponse(err)
- }
- if err := pseudohsm.SignWithKey(&ins.Tx, *xprv); err != nil {
- return NewErrorResponse(err)
- }
- log.Info("Sign Transaction complete.")
- return NewSuccessResponse(&signTemplateResp{Tx: &ins.Tx, SignComplete: txbuilder.SignProgress(&ins.Tx)})
-}
-
-type signTemplatesResp struct {
- Tx []*txbuilder.Template `json:"transaction"`
- SignComplete bool `json:"sign_complete"`
-}
-
-func (a *API) signTemplates(ctx context.Context, x struct {
- Password string `json:"password"`
- Txs []*txbuilder.Template `json:"transactions"`
-}) Response {
- signComplete := true
- for _, tx := range x.Txs {
- if err := txbuilder.Sign(ctx, tx, x.Password, a.PseudohsmSignTemplate); err != nil {
- log.WithField("build err", err).Error("fail on sign transaction.")
- return NewErrorResponse(err)
- }
- signComplete = signComplete && txbuilder.SignProgress(tx)
- }
-
- log.Info("Sign Chain Tx complete.")
- return NewSuccessResponse(&signTemplatesResp{Tx: x.Txs, SignComplete: signComplete})
-}
-
-func (a *API) PseudohsmSignTemplate(ctx context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
- return a.wallet.Hsm.XSign(xpub, path, data[:], password)
-}
-
-// ResetPasswordResp is response for reset key password
-type ResetPasswordResp struct {
- Changed bool `json:"changed"`
-}
-
-func (a *API) pseudohsmResetPassword(ctx context.Context, ins struct {
- XPub chainkd.XPub `json:"xpub"`
- OldPassword string `json:"old_password"`
- NewPassword string `json:"new_password"`
-}) Response {
- resp := &ResetPasswordResp{Changed: false}
- if err := a.wallet.Hsm.ResetPassword(ins.XPub, ins.OldPassword, ins.NewPassword); err != nil {
- return NewSuccessResponse(resp)
- }
- resp.Changed = true
- return NewSuccessResponse(resp)
-}
-
-// CheckPasswordResp is response for check key password
-type CheckPasswordResp struct {
- CheckResult bool `json:"check_result"`
-}
-
-func (a *API) pseudohsmCheckPassword(ctx context.Context, ins struct {
- XPub chainkd.XPub `json:"xpub"`
- Password string `json:"password"`
-}) Response {
- resp := &CheckPasswordResp{CheckResult: false}
- if _, err := a.wallet.Hsm.LoadChainKDKey(ins.XPub, ins.Password); err != nil {
- return NewSuccessResponse(resp)
- }
- resp.CheckResult = true
- return NewSuccessResponse(resp)
-}
-
-type keyPair struct {
- Xpub chainkd.XPub `json:"xpub"`
- Xprv chainkd.XPrv `json:"xprv"`
- Address string `json:"address,omitempty"`
-}
-
-func (a *API) createXKeys(ctx context.Context) Response {
- xprv, xpub, err := chainkd.NewXKeys(nil)
- if err != nil {
- return NewErrorResponse(err)
- }
-
- pubHash := crypto.Ripemd160(xpub.PublicKey())
-
- address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
- if err != nil {
- return NewErrorResponse(err)
- }
-
- return NewSuccessResponse(&keyPair{Xprv: xprv, Xpub: xpub, Address: address.EncodeAddress()})
-}