arnaucube
arnaucube/blindsig-client-server-examplePublic Self-hosted repository
blindsig-client-server-example/main.go
main.goRaw
 1package main
 2
 3import (
 4	"math/big"
 5	"net/http"
 6
 7	blindsecp256k1 "github.com/arnaucube/go-blindsecp256k1"
 8	"github.com/gin-gonic/gin"
 9)
10
11var sk *blindsecp256k1.PrivateKey
12var secretRs = make(map[string]*big.Int)
13
14func getNewRequest(c *gin.Context) {
15	k, signerR := blindsecp256k1.NewRequestParameters()
16	key := signerR.X.String() + signerR.Y.String()
17	secretRs[key] = k
18	c.JSON(http.StatusOK, gin.H{"signerR": signerR, "signerQ": sk.Public().Point()})
19}
20
21type msgPostBlindSign struct {
22	M string                `json:"m"`
23	R *blindsecp256k1.Point `json:"r"`
24}
25
26func postBlindSign(c *gin.Context) {
27	var msg msgPostBlindSign
28	c.BindJSON(&msg)
29
30	m, ok := new(big.Int).SetString(msg.M, 10)
31	if !ok {
32		c.String(http.StatusBadRequest, "can not parse m")
33		return
34	}
35
36	key := msg.R.X.String() + msg.R.Y.String()
37	if _, ok := secretRs[key]; !ok {
38		c.String(http.StatusBadRequest, "unknown R")
39		return
40	}
41	k := secretRs[key]
42	sBlind, err := sk.BlindSign(m, k)
43	if err != nil {
44		c.String(http.StatusBadRequest, "err on BlindSign: "+err.Error())
45		return
46	}
47	delete(secretRs, key)
48	c.JSON(http.StatusOK, gin.H{"sBlind": sBlind.String()})
49}
50
51func main() {
52	secretRs = make(map[string]*big.Int)
53	sk = blindsecp256k1.NewPrivateKey()
54
55	r := gin.Default()
56
57	r.GET("/request", getNewRequest)
58	r.POST("/blindsign", postBlindSign)
59	r.Static("/web", "./client")
60
61	r.Run("127.0.0.1:3000")
62}