Skip to main content

🏃 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
}