package api import ( "context" log "github.com/sirupsen/logrus" "github.com/vapor/blockchain/txbuilder" "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)}) } 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) }