lotus/chain/wallet/key/key.go

96 lines
2.2 KiB
Go
Raw Normal View History

package key
2020-09-04 20:17:28 +00:00
import (
"golang.org/x/crypto/sha3"
2020-09-04 20:17:28 +00:00
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/builtin"
2020-10-08 22:51:04 +00:00
"github.com/filecoin-project/go-state-types/crypto"
2020-09-04 20:17:28 +00:00
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/sigs"
)
func GenerateKey(typ types.KeyType) (*Key, error) {
ctyp := ActSigType(typ)
if ctyp == crypto.SigTypeUnknown {
return nil, xerrors.Errorf("unknown sig type: %s", typ)
}
pk, err := sigs.Generate(ctyp)
2020-09-04 20:17:28 +00:00
if err != nil {
return nil, err
}
ki := types.KeyInfo{
Type: typ,
2020-09-04 20:17:28 +00:00
PrivateKey: pk,
}
return NewKey(ki)
}
type Key struct {
types.KeyInfo
PublicKey []byte
Address address.Address
}
func NewKey(keyinfo types.KeyInfo) (*Key, error) {
k := &Key{
KeyInfo: keyinfo,
}
var err error
k.PublicKey, err = sigs.ToPublic(ActSigType(k.Type), k.PrivateKey)
if err != nil {
return nil, err
}
switch k.Type {
case types.KTSecp256k1:
2020-09-04 20:17:28 +00:00
k.Address, err = address.NewSecp256k1Address(k.PublicKey)
if err != nil {
return nil, xerrors.Errorf("converting Secp256k1 to address: %w", err)
}
case types.KTDelegated:
// Assume eth for now
hasher := sha3.NewLegacyKeccak256()
pubk := k.PublicKey
// if we get an uncompressed public key (that's what we get from the library,
// but putting this check here for defensiveness), strip the prefix
if pubk[0] == 0x04 {
pubk = pubk[1:]
}
hasher.Write(pubk)
k.Address, err = address.NewDelegatedAddress(builtin.EthereumAddressManagerActorID, hasher.Sum(nil)[12:])
if err != nil {
return nil, xerrors.Errorf("converting Delegated to address: %w", err)
}
case types.KTBLS:
2020-09-04 20:17:28 +00:00
k.Address, err = address.NewBLSAddress(k.PublicKey)
if err != nil {
return nil, xerrors.Errorf("converting BLS to address: %w", err)
}
default:
return nil, xerrors.Errorf("unsupported key type: %s", k.Type)
2020-09-04 20:17:28 +00:00
}
2020-09-04 20:17:28 +00:00
return k, nil
}
func ActSigType(typ types.KeyType) crypto.SigType {
2020-09-04 20:17:28 +00:00
switch typ {
case types.KTBLS:
2020-09-04 20:17:28 +00:00
return crypto.SigTypeBLS
case types.KTSecp256k1:
2020-09-04 20:17:28 +00:00
return crypto.SigTypeSecp256k1
case types.KTDelegated:
return crypto.SigTypeDelegated
2020-09-04 20:17:28 +00:00
default:
return crypto.SigTypeUnknown
2020-09-04 20:17:28 +00:00
}
}