arnaucube
arnaucube/go-dvotePublic Self-hosted repository
go-dvote/crypto/signature_ecdsa/signature.go
crypto/signature_ecdsa/signature.goRaw
 1package signature
 2
 3import (
 4	"crypto/ecdsa"
 5	hex "encoding/hex"
 6	"errors"
 7
 8	crypto "github.com/ethereum/go-ethereum/crypto"
 9)
10
11type SignKeys struct {
12	Public  *ecdsa.PublicKey
13	Private *ecdsa.PrivateKey
14}
15
16// generate new keys
17func (k *SignKeys) Generate() error {
18	var err error
19	key, err := crypto.GenerateKey()
20	if err != nil {
21		return err
22	}
23	k.Public = &key.PublicKey
24	k.Private = key
25	return nil
26}
27
28// imports a private hex key
29func (k *SignKeys) AddHexKey(privHex string) error {
30	var err error
31	k.Private, err = crypto.HexToECDSA(privHex)
32	if err == nil {
33		k.Public = &k.Private.PublicKey
34	}
35	return err
36}
37
38// returns the public and private keys as hex strings
39func (k *SignKeys) HexString() (string, string) {
40	pubHex := hex.EncodeToString(crypto.CompressPubkey(k.Public))
41	privHex := hex.EncodeToString(crypto.FromECDSA(k.Private))
42	return pubHex, privHex
43}
44
45// message is a normal string (no HexString)
46func (k *SignKeys) Sign(message string) (string, error) {
47	if k.Private == nil {
48		return "", errors.New("No private key available")
49	}
50	hash := crypto.Keccak256([]byte(message))
51	signature, err := crypto.Sign(hash, k.Private)
52	signHex := hex.EncodeToString(signature)
53	return signHex, err
54}
55
56// message is a normal string, signature and pubHex are HexStrings
57func (k *SignKeys) Verify(message, signHex, pubHex string) (bool, error) {
58	signature, err := hex.DecodeString(signHex)
59	if err != nil {
60		return false, err
61	}
62	pub, err := hex.DecodeString(pubHex)
63	if err != nil {
64		return false, err
65	}
66	hash := crypto.Keccak256([]byte(message))
67	result := crypto.VerifySignature(pub, hash, signature[:64])
68	return result, nil
69}