Skip to content
/ ring-go Public

💍implementation of linkable ring signatures in go

License

Notifications You must be signed in to change notification settings

noot/ring-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1a8bebe · Jun 17, 2024
Jan 15, 2023
May 30, 2020
Jan 15, 2023
Jun 17, 2024
Jun 17, 2024
Jun 17, 2024
Jun 17, 2024
Jan 15, 2023
Jan 15, 2023
Jun 17, 2024
Jun 17, 2024
Jan 15, 2023
Jan 15, 2023
Jan 15, 2023

Repository files navigation

ring-go

Implementation of linkable ring signatures using elliptic curve crypto in pure Go. It supports ring signatures over both ed25519 and secp256k1.

requirements

go 1.19

get

go get github.com/noot/ring-go

references

This implementation is based off of Ring Confidential Transactions, in particular section 2, which defines MLSAG (Multilayered Linkable Spontaneous Anonymous Group signatures).

usage

See examples/main.go.

package main

import (
	"fmt"

	ring "github.com/noot/ring-go"
	"golang.org/x/crypto/sha3"
)

func signAndVerify(curve ring.Curve) {
	privkey := curve.NewRandomScalar()
	msgHash := sha3.Sum256([]byte("helloworld"))

	// size of the public key ring (anonymity set)
	const size = 16

	// our key's secret index within the set
	const idx = 7
	
	keyring, err := ring.NewKeyRing(curve, size, privkey, idx)
	if err != nil {
		panic(err)
	}

	sig, err := keyring.Sign(msgHash, privkey)
	if err != nil {
		panic(err)
	}

	ok := sig.Verify(msgHash)
	if !ok {
		fmt.Println("failed to verify :(")
		return
	}

	fmt.Println("verified signature!")
}

func main() {
	fmt.Println("using secp256k1...")
	signAndVerify(ring.Secp256k1())
	fmt.Println("using ed25519...")
	signAndVerify(ring.Ed25519())
}