|
package aliyundrive |
|
|
|
import ( |
|
"crypto/ecdsa" |
|
"crypto/rand" |
|
"encoding/hex" |
|
"math/big" |
|
|
|
"github.com/dustinxie/ecc" |
|
) |
|
|
|
func NewPrivateKey() (*ecdsa.PrivateKey, error) { |
|
p256k1 := ecc.P256k1() |
|
return ecdsa.GenerateKey(p256k1, rand.Reader) |
|
} |
|
|
|
func NewPrivateKeyFromHex(hex_ string) (*ecdsa.PrivateKey, error) { |
|
data, err := hex.DecodeString(hex_) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return NewPrivateKeyFromBytes(data), nil |
|
|
|
} |
|
|
|
func NewPrivateKeyFromBytes(priv []byte) *ecdsa.PrivateKey { |
|
p256k1 := ecc.P256k1() |
|
x, y := p256k1.ScalarBaseMult(priv) |
|
return &ecdsa.PrivateKey{ |
|
PublicKey: ecdsa.PublicKey{ |
|
Curve: p256k1, |
|
X: x, |
|
Y: y, |
|
}, |
|
D: new(big.Int).SetBytes(priv), |
|
} |
|
} |
|
|
|
func PrivateKeyToHex(private *ecdsa.PrivateKey) string { |
|
return hex.EncodeToString(PrivateKeyToBytes(private)) |
|
} |
|
|
|
func PrivateKeyToBytes(private *ecdsa.PrivateKey) []byte { |
|
return private.D.Bytes() |
|
} |
|
|
|
func PublicKeyToHex(public *ecdsa.PublicKey) string { |
|
return hex.EncodeToString(PublicKeyToBytes(public)) |
|
} |
|
|
|
func PublicKeyToBytes(public *ecdsa.PublicKey) []byte { |
|
x := public.X.Bytes() |
|
if len(x) < 32 { |
|
for i := 0; i < 32-len(x); i++ { |
|
x = append([]byte{0}, x...) |
|
} |
|
} |
|
|
|
y := public.Y.Bytes() |
|
if len(y) < 32 { |
|
for i := 0; i < 32-len(y); i++ { |
|
y = append([]byte{0}, y...) |
|
} |
|
} |
|
return append(x, y...) |
|
} |
|
|