// walletSeedHandler handles API calls to /wallet/seed. func (api *API) walletSeedHandler(w http.ResponseWriter, req *http.Request, _ httprouter.Params) { // Get the seed using the ditionary + phrase dictID := mnemonics.DictionaryID(req.FormValue("dictionary")) if dictID == "" { dictID = "english" } seed, err := modules.StringToSeed(req.FormValue("seed"), dictID) if err != nil { WriteError(w, Error{"error when calling /wallet/seed: " + err.Error()}, http.StatusBadRequest) return } potentialKeys := encryptionKeys(req.FormValue("encryptionpassword")) for _, key := range potentialKeys { err := api.wallet.LoadSeed(key, seed) if err == nil { WriteSuccess(w) return } if err != nil && err != modules.ErrBadEncryptionKey { WriteError(w, Error{"error when calling /wallet/seed: " + err.Error()}, http.StatusBadRequest) return } } WriteError(w, Error{"error when calling /wallet/seed: " + modules.ErrBadEncryptionKey.Error()}, http.StatusBadRequest) }
// encryptionKeys enumerates the possible encryption keys that can be derived // from an input string. func encryptionKeys(seedStr string) (validKeys []crypto.TwofishKey) { dicts := []mnemonics.DictionaryID{"english", "german", "japanese"} for _, dict := range dicts { seed, err := modules.StringToSeed(seedStr, dict) if err != nil { continue } validKeys = append(validKeys, crypto.TwofishKey(crypto.HashObject(seed))) } validKeys = append(validKeys, crypto.TwofishKey(crypto.HashObject(seedStr))) return validKeys }
// walletSeedsHandlerPOST handles a POST request to /wallet/seeds. func (srv *Server) walletSeedsHandlerPOST(w http.ResponseWriter, req *http.Request) { // Get the seed using the ditionary + phrase dictID := mnemonics.DictionaryID(req.FormValue("dictionary")) seed, err := modules.StringToSeed(req.FormValue("seed"), dictID) if err != nil { writeError(w, "error when calling /wallet/seeds: "+err.Error(), http.StatusBadRequest) return } potentialKeys := encryptionKeys(req.FormValue("encryptionpassword")) for _, key := range potentialKeys { err := srv.wallet.RecoverSeed(key, seed) if err == nil { writeSuccess(w) return } if err != nil && err != modules.ErrBadEncryptionKey { writeError(w, "error when calling /wallet/seeds: "+err.Error(), http.StatusBadRequest) return } } writeError(w, "error when calling /wallet/seeds: "+modules.ErrBadEncryptionKey.Error(), http.StatusBadRequest) }