| 
									
										
										
										
											2018-02-14 13:49:11 +01:00
										 |  |  | // 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-21 11:36:05 +01:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/hex" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts/keystore" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | 	"gopkg.in/urfave/cli.v1" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type outputInspect struct { | 
					
						
							|  |  |  | 	Address    string | 
					
						
							|  |  |  | 	PublicKey  string | 
					
						
							|  |  |  | 	PrivateKey string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var commandInspect = cli.Command{ | 
					
						
							|  |  |  | 	Name:      "inspect", | 
					
						
							|  |  |  | 	Usage:     "inspect a keyfile", | 
					
						
							|  |  |  | 	ArgsUsage: "<keyfile>", | 
					
						
							|  |  |  | 	Description: ` | 
					
						
							|  |  |  | Print various information about the keyfile. | 
					
						
							| 
									
										
										
										
											2018-01-16 15:42:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-21 11:36:05 +01:00
										 |  |  | Private key information can be printed by using the --private flag; | 
					
						
							|  |  |  | make sure to use this feature with great caution!`, | 
					
						
							|  |  |  | 	Flags: []cli.Flag{ | 
					
						
							|  |  |  | 		passphraseFlag, | 
					
						
							|  |  |  | 		jsonFlag, | 
					
						
							|  |  |  | 		cli.BoolFlag{ | 
					
						
							|  |  |  | 			Name:  "private", | 
					
						
							|  |  |  | 			Usage: "include the private key in the output", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	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. | 
					
						
							| 
									
										
										
										
											2018-06-08 15:07:07 +02:00
										 |  |  | 		passphrase := getPassphrase(ctx) | 
					
						
							| 
									
										
										
										
											2017-12-21 11:36:05 +01:00
										 |  |  | 		key, err := keystore.DecryptKey(keyjson, passphrase) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Error decrypting key: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Output all relevant information we can retrieve. | 
					
						
							|  |  |  | 		showPrivate := ctx.Bool("private") | 
					
						
							|  |  |  | 		out := outputInspect{ | 
					
						
							|  |  |  | 			Address: key.Address.Hex(), | 
					
						
							|  |  |  | 			PublicKey: hex.EncodeToString( | 
					
						
							|  |  |  | 				crypto.FromECDSAPub(&key.PrivateKey.PublicKey)), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if showPrivate { | 
					
						
							|  |  |  | 			out.PrivateKey = hex.EncodeToString(crypto.FromECDSA(key.PrivateKey)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ctx.Bool(jsonFlag.Name) { | 
					
						
							|  |  |  | 			mustPrintJSON(out) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			fmt.Println("Address:       ", out.Address) | 
					
						
							|  |  |  | 			fmt.Println("Public key:    ", out.PublicKey) | 
					
						
							|  |  |  | 			if showPrivate { | 
					
						
							|  |  |  | 				fmt.Println("Private key:   ", out.PrivateKey) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } |