mirror of https://github.com/Xhofe/alist
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
|
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...)
|
||
|
}
|