| 
									
										
										
										
											2019-07-22 12:17:27 +03:00
										 |  |  | // Copyright 2018 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts/keystore" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							|  |  |  | 	"gopkg.in/urfave/cli.v1" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var newPassphraseFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 	Name:  "newpasswordfile", | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | 	Usage: "the file that contains the new password for the keyfile", | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var commandChangePassphrase = cli.Command{ | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | 	Name:      "changepassword", | 
					
						
							|  |  |  | 	Usage:     "change the password on a keyfile", | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 	ArgsUsage: "<keyfile>", | 
					
						
							|  |  |  | 	Description: ` | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | Change the password of a keyfile.`, | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 	Flags: []cli.Flag{ | 
					
						
							|  |  |  | 		passphraseFlag, | 
					
						
							|  |  |  | 		newPassphraseFlag, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	Action: func(ctx *cli.Context) error { | 
					
						
							|  |  |  | 		keyfilepath := ctx.Args().First() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Read key from file. | 
					
						
							|  |  |  | 		keyjson, err := ioutil.ReadFile(keyfilepath) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Decrypt key with passphrase. | 
					
						
							| 
									
										
										
										
											2020-06-08 18:55:51 +09:00
										 |  |  | 		passphrase := getPassphrase(ctx, false) | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 		key, err := keystore.DecryptKey(keyjson, passphrase) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Error decrypting key: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Get a new passphrase. | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | 		fmt.Println("Please provide a new password") | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 		var newPhrase string | 
					
						
							|  |  |  | 		if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" { | 
					
						
							|  |  |  | 			content, err := ioutil.ReadFile(passFile) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | 				utils.Fatalf("Failed to read new password file '%s': %v", passFile, err) | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			newPhrase = strings.TrimRight(string(content), "\r\n") | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-06-30 15:56:40 +08:00
										 |  |  | 			newPhrase = utils.GetPassPhrase("", true) | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Encrypt the key with the new passphrase. | 
					
						
							|  |  |  | 		newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2019-08-12 11:00:38 +02:00
										 |  |  | 			utils.Fatalf("Error encrypting with new password: %v", err) | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Then write the new keyfile in place of the old one. | 
					
						
							| 
									
										
										
										
											2019-11-19 10:16:34 +01:00
										 |  |  | 		if err := ioutil.WriteFile(keyfilepath, newJson, 0600); err != nil { | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 			utils.Fatalf("Error writing new keyfile to disk: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Don't print anything.  Just return successfully, | 
					
						
							|  |  |  | 		// producing a positive exit code. | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } |