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.

166 lines
3.7 KiB

  1. package main
  2. import (
  3. "blindsecp256k1"
  4. "fmt"
  5. "math/big"
  6. "syscall/js"
  7. blindsecp256k1v0 "blindsecp256k1/v0"
  8. )
  9. func main() {
  10. c := make(chan struct{}, 0)
  11. println("WASM blindsecp256k1 initialized")
  12. registerCallbacks()
  13. <-c
  14. }
  15. func registerCallbacks() {
  16. // blindv0 & unblindv0 uses:
  17. // http://www.isecure-journal.com/article_39171_47f9ec605dd3918c2793565ec21fcd7a.pdf
  18. js.Global().Set("blindv0", js.FuncOf(blindv0))
  19. js.Global().Set("unblindv0", js.FuncOf(unblindv0))
  20. // blind & unblind uses: https://sci-hub.do/10.1109/ICCKE.2013.6682844
  21. js.Global().Set("blind", js.FuncOf(blind))
  22. js.Global().Set("unblind", js.FuncOf(unblind))
  23. }
  24. func stringToBigInt(s string) *big.Int {
  25. b, ok := new(big.Int).SetString(s, 10)
  26. if !ok {
  27. panic(fmt.Errorf("error parsing string *big.Int: %s", s))
  28. }
  29. return b
  30. }
  31. func blindv0(this js.Value, values []js.Value) interface{} {
  32. mStr := values[0].String()
  33. signerQxStr := values[1].String()
  34. signerQyStr := values[2].String()
  35. signerRxStr := values[3].String()
  36. signerRyStr := values[4].String()
  37. m := stringToBigInt(mStr)
  38. signerQx := stringToBigInt(signerQxStr)
  39. signerQy := stringToBigInt(signerQyStr)
  40. signerRx := stringToBigInt(signerRxStr)
  41. signerRy := stringToBigInt(signerRyStr)
  42. signerQ := &blindsecp256k1v0.PublicKey{
  43. X: signerQx,
  44. Y: signerQy,
  45. }
  46. signerR := &blindsecp256k1v0.Point{
  47. X: signerRx,
  48. Y: signerRy,
  49. }
  50. mBlinded, user := blindsecp256k1v0.Blind(m, signerQ, signerR)
  51. r := make(map[string]interface{})
  52. r["mBlinded"] = mBlinded.String()
  53. r["uA"] = user.A.String()
  54. r["uB"] = user.B.String()
  55. r["uC"] = user.C.String()
  56. r["uC"] = user.C.String()
  57. r["uFx"] = user.F.X.String()
  58. r["uFy"] = user.F.Y.String()
  59. return r
  60. }
  61. func unblindv0(this js.Value, values []js.Value) interface{} {
  62. sBlindStr := values[0].String()
  63. mStr := values[1].String()
  64. uBStr := values[2].String()
  65. uCStr := values[3].String()
  66. uFxStr := values[4].String()
  67. uFyStr := values[5].String()
  68. sBlind := stringToBigInt(sBlindStr)
  69. m := stringToBigInt(mStr)
  70. uB := stringToBigInt(uBStr)
  71. uC := stringToBigInt(uCStr)
  72. uFx := stringToBigInt(uFxStr)
  73. uFy := stringToBigInt(uFyStr)
  74. uF := &blindsecp256k1v0.Point{
  75. X: uFx,
  76. Y: uFy,
  77. }
  78. u := &blindsecp256k1v0.UserSecretData{
  79. // A not needed to Unblind
  80. B: uB,
  81. C: uC,
  82. F: uF,
  83. }
  84. sig := blindsecp256k1v0.Unblind(sBlind, m, u)
  85. r := make(map[string]interface{})
  86. r["s"] = sig.S.String()
  87. r["fx"] = sig.F.X.String()
  88. r["fy"] = sig.F.Y.String()
  89. return r
  90. }
  91. func blind(this js.Value, values []js.Value) interface{} {
  92. mStr := values[0].String()
  93. signerRxStr := values[1].String()
  94. signerRyStr := values[2].String()
  95. m := stringToBigInt(mStr)
  96. signerRx := stringToBigInt(signerRxStr)
  97. signerRy := stringToBigInt(signerRyStr)
  98. signerR := &blindsecp256k1.Point{
  99. X: signerRx,
  100. Y: signerRy,
  101. }
  102. mBlinded, user := blindsecp256k1.Blind(m, signerR)
  103. r := make(map[string]interface{})
  104. r["mBlinded"] = mBlinded.String()
  105. r["uA"] = user.A.String()
  106. r["uB"] = user.B.String()
  107. r["uFx"] = user.F.X.String()
  108. r["uFy"] = user.F.Y.String()
  109. return r
  110. }
  111. func unblind(this js.Value, values []js.Value) interface{} {
  112. sBlindStr := values[0].String()
  113. mStr := values[1].String()
  114. uAStr := values[2].String()
  115. uBStr := values[3].String()
  116. uFxStr := values[4].String()
  117. uFyStr := values[5].String()
  118. sBlind := stringToBigInt(sBlindStr)
  119. m := stringToBigInt(mStr)
  120. uA := stringToBigInt(uAStr)
  121. uB := stringToBigInt(uBStr)
  122. uFx := stringToBigInt(uFxStr)
  123. uFy := stringToBigInt(uFyStr)
  124. uF := &blindsecp256k1.Point{
  125. X: uFx,
  126. Y: uFy,
  127. }
  128. u := &blindsecp256k1.UserSecretData{
  129. A: uA,
  130. B: uB,
  131. F: uF,
  132. }
  133. sig := blindsecp256k1.Unblind(sBlind, m, u)
  134. r := make(map[string]interface{})
  135. r["s"] = sig.S.String()
  136. r["fx"] = sig.F.X.String()
  137. r["fy"] = sig.F.Y.String()
  138. return r
  139. }