Files
pg/secure/curve25519.go

58 lines
1.1 KiB
Go

package secure
import (
"crypto/rand"
"golang.org/x/crypto/curve25519"
"storj.io/common/base58"
)
type PrivateKey struct {
PublicKey
b []byte
}
func (key *PrivateKey) String() string {
return base58.Encode(key.b)
}
func (key *PrivateKey) SharedKey(pubKey string) ([]byte, error) {
b := base58.Decode(pubKey)
secret, err := curve25519.X25519(key.b, b)
if err != nil {
return nil, err
}
return secret, nil
}
type PublicKey struct {
b []byte
}
func (key *PublicKey) String() string {
return base58.Encode(key.b)
}
func GenerateCurve25519() (*PrivateKey, error) {
var priv, pub [32]byte
_, err := rand.Read(priv[:])
if err != nil {
return nil, err
}
priv[0] &= 248
priv[31] &= 127
priv[31] |= 64
curve25519.ScalarBaseMult(&pub, &priv)
return &PrivateKey{b: priv[:], PublicKey: PublicKey{b: pub[:]}}, nil
}
func Curve25519PrivateKey(privateKey string) (*PrivateKey, error) {
priv := base58.Decode(privateKey)
var pub [32]byte
curve25519.ScalarBaseMult(&pub, (*[32]byte)(priv))
return &PrivateKey{b: priv, PublicKey: PublicKey{b: pub[:]}}, nil
}