🏃 Go
The Go implementation of Sign in with Ethereum can be found here:
signinwithethereum/siwe-go
→
Installation
Install the library using Go get:
go get -u github.com/signinwithethereum/siwe-go
Usage
Parsing a SIWE Message
var message *siwe.Message
var err error
message, err = siwe.ParseMessage(messageStr)
Verifying and Authenticating a SIWE Message
// Verify using EIP-191, returns the Ethereum public key
var publicKey *ecdsa.PublicKey
var err error
publicKey, err = message.VerifyEIP191(signature)
// Check time constraints
if message.ValidNow() {
// Message is valid
}
// Combined verification with optional nonce and timestamp
publicKey, err = message.Verify(signature, optionalNonce, optionalTimestamp)
Serializing a SIWE Message
fmt.Printf("%s", message.String())
Signing Messages from Go Code
func signHash(data []byte) common.Hash {
msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
return crypto.Keccak256Hash([]byte(msg))
}
func signMessage(message string, privateKey *ecdsa.PrivateKey) ([]byte, error) {
sign := signHash([]byte(message))
signature, err := crypto.Sign(sign.Bytes(), privateKey)
if err != nil {
return nil, err
}
signature[64] += 27
return signature, nil
}