| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | package crypto | 
					
						
							| 
									
										
										
										
											2014-06-29 16:02:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-10-08 12:06:39 +02:00
										 |  |  | 	"strings" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2015-03-20 13:36:52 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto/secp256k1" | 
					
						
							| 
									
										
										
										
											2014-06-29 16:02:23 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type KeyPair struct { | 
					
						
							|  |  |  | 	PrivateKey []byte | 
					
						
							|  |  |  | 	PublicKey  []byte | 
					
						
							| 
									
										
										
										
											2014-06-29 20:28:04 +01:00
										 |  |  | 	address    []byte | 
					
						
							|  |  |  | 	mnemonic   string | 
					
						
							| 
									
										
										
										
											2014-06-29 16:02:23 +01:00
										 |  |  | 	// The associated account | 
					
						
							|  |  |  | 	// account *StateObject | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GenerateNewKeyPair() *KeyPair { | 
					
						
							|  |  |  | 	_, prv := secp256k1.GenerateKeyPair() | 
					
						
							|  |  |  | 	keyPair, _ := NewKeyPairFromSec(prv) // swallow error, this one cannot err | 
					
						
							|  |  |  | 	return keyPair | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) { | 
					
						
							|  |  |  | 	pubkey, err := secp256k1.GeneratePubKey(seckey) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (k *KeyPair) Address() []byte { | 
					
						
							| 
									
										
										
										
											2014-06-29 20:28:04 +01:00
										 |  |  | 	if k.address == nil { | 
					
						
							| 
									
										
										
										
											2014-10-08 12:06:39 +02:00
										 |  |  | 		k.address = Sha3(k.PublicKey[1:])[12:] | 
					
						
							| 
									
										
										
										
											2014-06-29 20:28:04 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return k.address | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (k *KeyPair) Mnemonic() string { | 
					
						
							|  |  |  | 	if k.mnemonic == "" { | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 		k.mnemonic = strings.Join(MnemonicEncode(common.Bytes2Hex(k.PrivateKey)), " ") | 
					
						
							| 
									
										
										
										
											2014-06-29 20:28:04 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return k.mnemonic | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (k *KeyPair) AsStrings() (string, string, string, string) { | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	return k.Mnemonic(), common.Bytes2Hex(k.Address()), common.Bytes2Hex(k.PrivateKey), common.Bytes2Hex(k.PublicKey) | 
					
						
							| 
									
										
										
										
											2014-06-29 16:02:23 +01:00
										 |  |  | } |