This repository has been archived by the owner on May 13, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 346
/
private_account.go
127 lines (103 loc) · 3.27 KB
/
private_account.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright Monax Industries Limited
// SPDX-License-Identifier: Apache-2.0
package acm
import (
"fmt"
"encoding/json"
"github.com/hyperledger/burrow/crypto"
)
type AddressableSigner interface {
crypto.Addressable
crypto.Signer
}
type PrivateAccount struct {
concretePrivateAccount *ConcretePrivateAccount
}
func (pa *PrivateAccount) GetAddress() crypto.Address {
return pa.concretePrivateAccount.Address
}
func (pa *PrivateAccount) GetPublicKey() *crypto.PublicKey {
return &pa.concretePrivateAccount.PublicKey
}
func (pa *PrivateAccount) Sign(msg []byte) (*crypto.Signature, error) {
return pa.concretePrivateAccount.PrivateKey.Sign(msg)
}
func (pa PrivateAccount) MarshalJSON() ([]byte, error) {
return json.Marshal(pa.concretePrivateAccount)
}
func (pa *PrivateAccount) UnmarshalJSON(bytes []byte) error {
err := json.Unmarshal(bytes, &pa.concretePrivateAccount)
if err != nil {
return err
}
return nil
}
func (pa *PrivateAccount) PrivateKey() crypto.PrivateKey {
return pa.concretePrivateAccount.PrivateKey
}
func (pa *PrivateAccount) ConcretePrivateAccount() *ConcretePrivateAccount {
cpa := *pa.concretePrivateAccount
return &cpa
}
func (pa *PrivateAccount) String() string {
return fmt.Sprintf("PrivateAccount{%v}", pa.GetAddress())
}
type ConcretePrivateAccount struct {
Address crypto.Address
PublicKey crypto.PublicKey
PrivateKey crypto.PrivateKey
}
func (cpa *ConcretePrivateAccount) String() string {
return fmt.Sprintf("ConcretePrivateAccount{%v}", cpa.Address)
}
func (cpa ConcretePrivateAccount) PrivateAccount() *PrivateAccount {
return &PrivateAccount{
concretePrivateAccount: &cpa,
}
}
func PrivateAccountFromPrivateKey(privateKey crypto.PrivateKey) *PrivateAccount {
publicKey := privateKey.GetPublicKey()
return &PrivateAccount{
concretePrivateAccount: &ConcretePrivateAccount{
PrivateKey: privateKey,
PublicKey: *publicKey,
Address: publicKey.GetAddress(),
},
}
}
// Convert slice of ConcretePrivateAccounts to slice of SigningAccounts
func SigningAccounts(concretePrivateAccounts []*PrivateAccount) []AddressableSigner {
signingAccounts := make([]AddressableSigner, len(concretePrivateAccounts))
for i, cpa := range concretePrivateAccounts {
signingAccounts[i] = cpa
}
return signingAccounts
}
// Generates a new account with private key.
func GeneratePrivateAccount(ct crypto.CurveType) (*PrivateAccount, error) {
privateKey, err := crypto.GeneratePrivateKey(nil, ct)
if err != nil {
return nil, err
}
publicKey := privateKey.GetPublicKey()
return ConcretePrivateAccount{
Address: publicKey.GetAddress(),
PublicKey: *publicKey,
PrivateKey: privateKey,
}.PrivateAccount(), nil
}
func privateAccount(privateKey crypto.PrivateKey) *PrivateAccount {
publicKey := privateKey.GetPublicKey()
return ConcretePrivateAccount{
Address: publicKey.GetAddress(),
PublicKey: *publicKey,
PrivateKey: privateKey,
}.PrivateAccount()
}
// Generates a new account with private key from SHA256 hash of a secret
func GeneratePrivateAccountFromSecret(secret string) *PrivateAccount {
return privateAccount(crypto.PrivateKeyFromSecret(secret, crypto.CurveTypeEd25519))
}
func GenerateEthereumAccountFromSecret(secret string) *PrivateAccount {
return privateAccount(crypto.PrivateKeyFromSecret(secret, crypto.CurveTypeSecp256k1))
}