You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB

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