You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.6 KiB

package signature
import (
"crypto/ecdsa"
hex "encoding/hex"
"errors"
crypto "github.com/ethereum/go-ethereum/crypto"
)
type SignKeys struct {
Public *ecdsa.PublicKey
Private *ecdsa.PrivateKey
}
// generate new keys
func (k *SignKeys) Generate() error {
var err error
key, err := crypto.GenerateKey()
if err != nil {
return err
}
k.Public = &key.PublicKey
k.Private = key
return nil
}
// imports a private hex key
func (k *SignKeys) AddHexKey(privHex string) error {
var err error
k.Private, err = crypto.HexToECDSA(privHex)
if err == nil {
k.Public = &k.Private.PublicKey
}
return err
}
// returns the public and private keys as hex strings
func (k *SignKeys) HexString() (string, string) {
pubHex := hex.EncodeToString(crypto.CompressPubkey(k.Public))
privHex := hex.EncodeToString(crypto.FromECDSA(k.Private))
return pubHex, privHex
}
// message is a normal string (no HexString)
func (k *SignKeys) Sign(message string) (string, error) {
if k.Private == nil {
return "", errors.New("No private key available")
}
hash := crypto.Keccak256([]byte(message))
signature, err := crypto.Sign(hash, k.Private)
signHex := hex.EncodeToString(signature)
return signHex, err
}
// message is a normal string, signature and pubHex are HexStrings
func (k *SignKeys) Verify(message, signHex, pubHex string) (bool, error) {
signature, err := hex.DecodeString(signHex)
if err != nil {
return false, err
}
pub, err := hex.DecodeString(pubHex)
if err != nil {
return false, err
}
hash := crypto.Keccak256([]byte(message))
result := crypto.VerifySignature(pub, hash, signature[:64])
return result, nil
}