// Copyright 2017 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "encoding/json" "fmt" "io/ioutil" "strings" "github.com/ledgerwatch/turbo-geth/cmd/utils" "github.com/ledgerwatch/turbo-geth/console" "github.com/ledgerwatch/turbo-geth/crypto" "github.com/urfave/cli" ) // promptPassphrase prompts the user for a passphrase. Set confirmation to true // to require the user to confirm the passphrase. func promptPassphrase(confirmation bool) string { passphrase, err := console.Stdin.PromptPassword("Password: ") if err != nil { utils.Fatalf("Failed to read password: %v", err) } if confirmation { confirm, err := console.Stdin.PromptPassword("Repeat password: ") if err != nil { utils.Fatalf("Failed to read password confirmation: %v", err) } if passphrase != confirm { utils.Fatalf("Passwords do not match") } } return passphrase } // getPassphrase obtains a passphrase given by the user. It first checks the // --passfile command line flag and ultimately prompts the user for a // passphrase. func getPassphrase(ctx *cli.Context) string { // Look for the --passwordfile flag. passphraseFile := ctx.String(passphraseFlag.Name) if passphraseFile != "" { content, err := ioutil.ReadFile(passphraseFile) if err != nil { utils.Fatalf("Failed to read password file '%s': %v", passphraseFile, err) } return strings.TrimRight(string(content), "\r\n") } // Otherwise prompt the user for the passphrase. return promptPassphrase(false) } // signHash is a helper function that calculates a hash for the given message // that can be safely used to calculate a signature from. // // The hash is calulcated as // keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). // // This gives context to the signed message and prevents signing of transactions. func signHash(data []byte) []byte { msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) return crypto.Keccak256([]byte(msg)) } // mustPrintJSON prints the JSON encoding of the given object and // exits the program with an error message when the marshaling fails. func mustPrintJSON(jsonObject interface{}) { str, err := json.MarshalIndent(jsonObject, "", " ") if err != nil { utils.Fatalf("Failed to marshal JSON object: %v", err) } fmt.Println(string(str)) }