/
sign.go
64 lines (51 loc) · 1.75 KB
/
sign.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package ethereum
import (
"fmt"
ethereumSym "github.com/taubyte/go-sdk-symbols/ethereum/client"
"github.com/taubyte/go-sdk/ethereum/client/bytes"
)
// SignMessage returns an ECDSA signed message
func SignMessage(message, privKey []byte) ([]byte, error) {
err := verifySignInputs(message, privKey, nil, true, false)
if err != nil {
return nil, fmt.Errorf("invalid inputs: %s", err)
}
signature := make([]byte, bytes.EcdsaSignatureLength)
err0 := ethereumSym.EthSignMessage(&message[0], uint32(len(message)), &privKey[0], uint32(len(privKey)), &signature[0])
if err0 != 0 {
return nil, fmt.Errorf("signing message failed with: %s", err0)
}
return signature, nil
}
// VerifySignature checks the signed ECDSA message with the original message to verify if the message was signed by the given public key
func VerifySignature(message, publicKey, signature []byte) error {
err := verifySignInputs(message, publicKey, signature, false, true)
if err != nil {
return fmt.Errorf("invalid inputs: %s", err)
}
var isVerified uint32
err0 := ethereumSym.EthVerifySignature(&message[0], uint32(len(message)), &publicKey[0], uint32(len(publicKey)), &signature[0], &isVerified)
if err0 != 0 {
return fmt.Errorf("verifying signature failed with: %s", err0)
}
if isVerified == 0 {
return fmt.Errorf("signature not signed by this private key")
}
return nil
}
func verifySignInputs(message, key, signature []byte, keyPrivate, checkSig bool) error {
if len(message) == 0 {
return fmt.Errorf("message is empty")
}
if len(key) == 0 {
keyType := "public"
if keyPrivate {
keyType = "private"
}
return fmt.Errorf("%s Key is empty", keyType)
}
if checkSig && (len(signature) == 0 || signature == nil) {
return fmt.Errorf("signature is nil")
}
return nil
}