package main import ( "fmt" "math/big" "net/http" blindsecp256k1 "github.com/arnaucube/go-blindsecp256k1" "github.com/gin-gonic/gin" ) var sk *blindsecp256k1.PrivateKey var secretRs = make(map[string]*big.Int) func getNewRequest(c *gin.Context) { k, signerR := blindsecp256k1.NewRequestParameters() key := signerR.X.String() + signerR.Y.String() secretRs[key] = k c.JSON(http.StatusOK, gin.H{"signerR": signerR, "signerQ": sk.Public().Point()}) } type msgPostBlindSign struct { M string `json:"m"` R *blindsecp256k1.Point `json:"r"` } func postBlindSign(c *gin.Context) { var msg msgPostBlindSign c.BindJSON(&msg) m, ok := new(big.Int).SetString(msg.M, 10) if !ok { c.String(http.StatusBadRequest, "can not parse m") return } key := msg.R.X.String() + msg.R.Y.String() if _, ok := secretRs[key]; !ok { c.String(http.StatusBadRequest, "unknown R") return } k := secretRs[key] sBlind, err := sk.BlindSign(m, k) if err != nil { c.String(http.StatusBadRequest, "err on BlindSign: "+err.Error()) return } delete(secretRs, key) c.JSON(http.StatusOK, gin.H{"sBlind": sBlind.String()}) } type msgPostVerify struct { M string `json:"m"` Sig *blindsecp256k1.Signature `json:"sig"` Q *blindsecp256k1.PublicKey `json:"q"` } func postVerify(c *gin.Context) { var msg msgPostVerify c.BindJSON(&msg) m, ok := new(big.Int).SetString(msg.M, 10) if !ok { c.String(http.StatusBadRequest, "can not parse m") return } fmt.Println(msg.Sig.S, msg.Sig.F) v := blindsecp256k1.Verify(m, msg.Sig, sk.Public()) fmt.Println("v", v) if !v { fmt.Println("m", m) fmt.Println("sig.s", msg.Sig.S) fmt.Println("sig.f", msg.Sig.F) fmt.Println("pubk", sk.Public()) fmt.Println("q", msg.Q) c.JSON(http.StatusNotAcceptable, gin.H{"verification": false}) return } c.JSON(http.StatusOK, gin.H{"verification": v}) } func main() { secretRs = make(map[string]*big.Int) sk = blindsecp256k1.NewPrivateKey() r := gin.Default() r.GET("/request", getNewRequest) r.POST("/blindsign", postBlindSign) r.POST("/verify", postVerify) r.Static("/web", "./client") r.Run("127.0.0.1:3000") }