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}