arithmetic_fallback.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. // Native go field arithmetic code is generated with 'goff'
  2. // https://github.com/ConsenSys/goff
  3. // Many function signature of field operations are renamed.
  4. // Copyright 2020 ConsenSys AG
  5. //
  6. // Licensed under the Apache License, Version 2.0 (the "License");
  7. // you may not use this file except in compliance with the License.
  8. // You may obtain a copy of the License at
  9. //
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. //
  12. // Unless required by applicable law or agreed to in writing, software
  13. // distributed under the License is distributed on an "AS IS" BASIS,
  14. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. // See the License for the specific language governing permissions and
  16. // limitations under the License.
  17. // field modulus q =
  18. //
  19. // 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787
  20. // Code generated by goff DO NOT EDIT
  21. // goff version: v0.1.0 - build: 790f1f56eac432441e043abff8819eacddd1d668
  22. // fe are assumed to be in Montgomery form in all methods
  23. // /!\ WARNING /!\
  24. // this code has not been audited and is provided as-is. In particular,
  25. // there is no security guarantees such as constant time implementation
  26. // or side-channel attack resistance
  27. // /!\ WARNING /!\
  28. // Package bls (generated by goff) contains field arithmetics operations
  29. //go:build !amd64 || (!blsasm && !blsadx)
  30. // +build !amd64 !blsasm,!blsadx
  31. package bls12381
  32. import (
  33. "math/bits"
  34. )
  35. func add(z, x, y *fe) {
  36. var carry uint64
  37. z[0], carry = bits.Add64(x[0], y[0], 0)
  38. z[1], carry = bits.Add64(x[1], y[1], carry)
  39. z[2], carry = bits.Add64(x[2], y[2], carry)
  40. z[3], carry = bits.Add64(x[3], y[3], carry)
  41. z[4], carry = bits.Add64(x[4], y[4], carry)
  42. z[5], _ = bits.Add64(x[5], y[5], carry)
  43. // if z > q --> z -= q
  44. // note: this is NOT constant time
  45. if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) {
  46. var b uint64
  47. z[0], b = bits.Sub64(z[0], 13402431016077863595, 0)
  48. z[1], b = bits.Sub64(z[1], 2210141511517208575, b)
  49. z[2], b = bits.Sub64(z[2], 7435674573564081700, b)
  50. z[3], b = bits.Sub64(z[3], 7239337960414712511, b)
  51. z[4], b = bits.Sub64(z[4], 5412103778470702295, b)
  52. z[5], _ = bits.Sub64(z[5], 1873798617647539866, b)
  53. }
  54. }
  55. func addAssign(x, y *fe) {
  56. var carry uint64
  57. x[0], carry = bits.Add64(x[0], y[0], 0)
  58. x[1], carry = bits.Add64(x[1], y[1], carry)
  59. x[2], carry = bits.Add64(x[2], y[2], carry)
  60. x[3], carry = bits.Add64(x[3], y[3], carry)
  61. x[4], carry = bits.Add64(x[4], y[4], carry)
  62. x[5], _ = bits.Add64(x[5], y[5], carry)
  63. // if z > q --> z -= q
  64. // note: this is NOT constant time
  65. if !(x[5] < 1873798617647539866 || (x[5] == 1873798617647539866 && (x[4] < 5412103778470702295 || (x[4] == 5412103778470702295 && (x[3] < 7239337960414712511 || (x[3] == 7239337960414712511 && (x[2] < 7435674573564081700 || (x[2] == 7435674573564081700 && (x[1] < 2210141511517208575 || (x[1] == 2210141511517208575 && (x[0] < 13402431016077863595))))))))))) {
  66. var b uint64
  67. x[0], b = bits.Sub64(x[0], 13402431016077863595, 0)
  68. x[1], b = bits.Sub64(x[1], 2210141511517208575, b)
  69. x[2], b = bits.Sub64(x[2], 7435674573564081700, b)
  70. x[3], b = bits.Sub64(x[3], 7239337960414712511, b)
  71. x[4], b = bits.Sub64(x[4], 5412103778470702295, b)
  72. x[5], _ = bits.Sub64(x[5], 1873798617647539866, b)
  73. }
  74. }
  75. func ladd(z, x, y *fe) {
  76. var carry uint64
  77. z[0], carry = bits.Add64(x[0], y[0], 0)
  78. z[1], carry = bits.Add64(x[1], y[1], carry)
  79. z[2], carry = bits.Add64(x[2], y[2], carry)
  80. z[3], carry = bits.Add64(x[3], y[3], carry)
  81. z[4], carry = bits.Add64(x[4], y[4], carry)
  82. z[5], _ = bits.Add64(x[5], y[5], carry)
  83. }
  84. func laddAssign(x, y *fe) {
  85. var carry uint64
  86. x[0], carry = bits.Add64(x[0], y[0], 0)
  87. x[1], carry = bits.Add64(x[1], y[1], carry)
  88. x[2], carry = bits.Add64(x[2], y[2], carry)
  89. x[3], carry = bits.Add64(x[3], y[3], carry)
  90. x[4], carry = bits.Add64(x[4], y[4], carry)
  91. x[5], _ = bits.Add64(x[5], y[5], carry)
  92. }
  93. func double(z, x *fe) {
  94. var carry uint64
  95. z[0], carry = bits.Add64(x[0], x[0], 0)
  96. z[1], carry = bits.Add64(x[1], x[1], carry)
  97. z[2], carry = bits.Add64(x[2], x[2], carry)
  98. z[3], carry = bits.Add64(x[3], x[3], carry)
  99. z[4], carry = bits.Add64(x[4], x[4], carry)
  100. z[5], _ = bits.Add64(x[5], x[5], carry)
  101. // if z > q --> z -= q
  102. // note: this is NOT constant time
  103. if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) {
  104. var b uint64
  105. z[0], b = bits.Sub64(z[0], 13402431016077863595, 0)
  106. z[1], b = bits.Sub64(z[1], 2210141511517208575, b)
  107. z[2], b = bits.Sub64(z[2], 7435674573564081700, b)
  108. z[3], b = bits.Sub64(z[3], 7239337960414712511, b)
  109. z[4], b = bits.Sub64(z[4], 5412103778470702295, b)
  110. z[5], _ = bits.Sub64(z[5], 1873798617647539866, b)
  111. }
  112. }
  113. func doubleAssign(z *fe) {
  114. var carry uint64
  115. z[0], carry = bits.Add64(z[0], z[0], 0)
  116. z[1], carry = bits.Add64(z[1], z[1], carry)
  117. z[2], carry = bits.Add64(z[2], z[2], carry)
  118. z[3], carry = bits.Add64(z[3], z[3], carry)
  119. z[4], carry = bits.Add64(z[4], z[4], carry)
  120. z[5], _ = bits.Add64(z[5], z[5], carry)
  121. // if z > q --> z -= q
  122. // note: this is NOT constant time
  123. if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) {
  124. var b uint64
  125. z[0], b = bits.Sub64(z[0], 13402431016077863595, 0)
  126. z[1], b = bits.Sub64(z[1], 2210141511517208575, b)
  127. z[2], b = bits.Sub64(z[2], 7435674573564081700, b)
  128. z[3], b = bits.Sub64(z[3], 7239337960414712511, b)
  129. z[4], b = bits.Sub64(z[4], 5412103778470702295, b)
  130. z[5], _ = bits.Sub64(z[5], 1873798617647539866, b)
  131. }
  132. }
  133. func ldouble(z, x *fe) {
  134. var carry uint64
  135. z[0], carry = bits.Add64(x[0], x[0], 0)
  136. z[1], carry = bits.Add64(x[1], x[1], carry)
  137. z[2], carry = bits.Add64(x[2], x[2], carry)
  138. z[3], carry = bits.Add64(x[3], x[3], carry)
  139. z[4], carry = bits.Add64(x[4], x[4], carry)
  140. z[5], _ = bits.Add64(x[5], x[5], carry)
  141. }
  142. func sub(z, x, y *fe) {
  143. var b uint64
  144. z[0], b = bits.Sub64(x[0], y[0], 0)
  145. z[1], b = bits.Sub64(x[1], y[1], b)
  146. z[2], b = bits.Sub64(x[2], y[2], b)
  147. z[3], b = bits.Sub64(x[3], y[3], b)
  148. z[4], b = bits.Sub64(x[4], y[4], b)
  149. z[5], b = bits.Sub64(x[5], y[5], b)
  150. if b != 0 {
  151. var c uint64
  152. z[0], c = bits.Add64(z[0], 13402431016077863595, 0)
  153. z[1], c = bits.Add64(z[1], 2210141511517208575, c)
  154. z[2], c = bits.Add64(z[2], 7435674573564081700, c)
  155. z[3], c = bits.Add64(z[3], 7239337960414712511, c)
  156. z[4], c = bits.Add64(z[4], 5412103778470702295, c)
  157. z[5], _ = bits.Add64(z[5], 1873798617647539866, c)
  158. }
  159. }
  160. func subAssign(z, x *fe) {
  161. var b uint64
  162. z[0], b = bits.Sub64(z[0], x[0], 0)
  163. z[1], b = bits.Sub64(z[1], x[1], b)
  164. z[2], b = bits.Sub64(z[2], x[2], b)
  165. z[3], b = bits.Sub64(z[3], x[3], b)
  166. z[4], b = bits.Sub64(z[4], x[4], b)
  167. z[5], b = bits.Sub64(z[5], x[5], b)
  168. if b != 0 {
  169. var c uint64
  170. z[0], c = bits.Add64(z[0], 13402431016077863595, 0)
  171. z[1], c = bits.Add64(z[1], 2210141511517208575, c)
  172. z[2], c = bits.Add64(z[2], 7435674573564081700, c)
  173. z[3], c = bits.Add64(z[3], 7239337960414712511, c)
  174. z[4], c = bits.Add64(z[4], 5412103778470702295, c)
  175. z[5], _ = bits.Add64(z[5], 1873798617647539866, c)
  176. }
  177. }
  178. func lsubAssign(z, x *fe) {
  179. var b uint64
  180. z[0], b = bits.Sub64(z[0], x[0], 0)
  181. z[1], b = bits.Sub64(z[1], x[1], b)
  182. z[2], b = bits.Sub64(z[2], x[2], b)
  183. z[3], b = bits.Sub64(z[3], x[3], b)
  184. z[4], b = bits.Sub64(z[4], x[4], b)
  185. z[5], _ = bits.Sub64(z[5], x[5], b)
  186. }
  187. func neg(z *fe, x *fe) {
  188. if x.isZero() {
  189. z.zero()
  190. return
  191. }
  192. var borrow uint64
  193. z[0], borrow = bits.Sub64(13402431016077863595, x[0], 0)
  194. z[1], borrow = bits.Sub64(2210141511517208575, x[1], borrow)
  195. z[2], borrow = bits.Sub64(7435674573564081700, x[2], borrow)
  196. z[3], borrow = bits.Sub64(7239337960414712511, x[3], borrow)
  197. z[4], borrow = bits.Sub64(5412103778470702295, x[4], borrow)
  198. z[5], _ = bits.Sub64(1873798617647539866, x[5], borrow)
  199. }
  200. func mul(z, x, y *fe) {
  201. var t [6]uint64
  202. var c [3]uint64
  203. {
  204. // round 0
  205. v := x[0]
  206. c[1], c[0] = bits.Mul64(v, y[0])
  207. m := c[0] * 9940570264628428797
  208. c[2] = madd0(m, 13402431016077863595, c[0])
  209. c[1], c[0] = madd1(v, y[1], c[1])
  210. c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0])
  211. c[1], c[0] = madd1(v, y[2], c[1])
  212. c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0])
  213. c[1], c[0] = madd1(v, y[3], c[1])
  214. c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0])
  215. c[1], c[0] = madd1(v, y[4], c[1])
  216. c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0])
  217. c[1], c[0] = madd1(v, y[5], c[1])
  218. t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  219. }
  220. {
  221. // round 1
  222. v := x[1]
  223. c[1], c[0] = madd1(v, y[0], t[0])
  224. m := c[0] * 9940570264628428797
  225. c[2] = madd0(m, 13402431016077863595, c[0])
  226. c[1], c[0] = madd2(v, y[1], c[1], t[1])
  227. c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0])
  228. c[1], c[0] = madd2(v, y[2], c[1], t[2])
  229. c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0])
  230. c[1], c[0] = madd2(v, y[3], c[1], t[3])
  231. c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0])
  232. c[1], c[0] = madd2(v, y[4], c[1], t[4])
  233. c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0])
  234. c[1], c[0] = madd2(v, y[5], c[1], t[5])
  235. t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  236. }
  237. {
  238. // round 2
  239. v := x[2]
  240. c[1], c[0] = madd1(v, y[0], t[0])
  241. m := c[0] * 9940570264628428797
  242. c[2] = madd0(m, 13402431016077863595, c[0])
  243. c[1], c[0] = madd2(v, y[1], c[1], t[1])
  244. c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0])
  245. c[1], c[0] = madd2(v, y[2], c[1], t[2])
  246. c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0])
  247. c[1], c[0] = madd2(v, y[3], c[1], t[3])
  248. c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0])
  249. c[1], c[0] = madd2(v, y[4], c[1], t[4])
  250. c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0])
  251. c[1], c[0] = madd2(v, y[5], c[1], t[5])
  252. t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  253. }
  254. {
  255. // round 3
  256. v := x[3]
  257. c[1], c[0] = madd1(v, y[0], t[0])
  258. m := c[0] * 9940570264628428797
  259. c[2] = madd0(m, 13402431016077863595, c[0])
  260. c[1], c[0] = madd2(v, y[1], c[1], t[1])
  261. c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0])
  262. c[1], c[0] = madd2(v, y[2], c[1], t[2])
  263. c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0])
  264. c[1], c[0] = madd2(v, y[3], c[1], t[3])
  265. c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0])
  266. c[1], c[0] = madd2(v, y[4], c[1], t[4])
  267. c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0])
  268. c[1], c[0] = madd2(v, y[5], c[1], t[5])
  269. t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  270. }
  271. {
  272. // round 4
  273. v := x[4]
  274. c[1], c[0] = madd1(v, y[0], t[0])
  275. m := c[0] * 9940570264628428797
  276. c[2] = madd0(m, 13402431016077863595, c[0])
  277. c[1], c[0] = madd2(v, y[1], c[1], t[1])
  278. c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0])
  279. c[1], c[0] = madd2(v, y[2], c[1], t[2])
  280. c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0])
  281. c[1], c[0] = madd2(v, y[3], c[1], t[3])
  282. c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0])
  283. c[1], c[0] = madd2(v, y[4], c[1], t[4])
  284. c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0])
  285. c[1], c[0] = madd2(v, y[5], c[1], t[5])
  286. t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  287. }
  288. {
  289. // round 5
  290. v := x[5]
  291. c[1], c[0] = madd1(v, y[0], t[0])
  292. m := c[0] * 9940570264628428797
  293. c[2] = madd0(m, 13402431016077863595, c[0])
  294. c[1], c[0] = madd2(v, y[1], c[1], t[1])
  295. c[2], z[0] = madd2(m, 2210141511517208575, c[2], c[0])
  296. c[1], c[0] = madd2(v, y[2], c[1], t[2])
  297. c[2], z[1] = madd2(m, 7435674573564081700, c[2], c[0])
  298. c[1], c[0] = madd2(v, y[3], c[1], t[3])
  299. c[2], z[2] = madd2(m, 7239337960414712511, c[2], c[0])
  300. c[1], c[0] = madd2(v, y[4], c[1], t[4])
  301. c[2], z[3] = madd2(m, 5412103778470702295, c[2], c[0])
  302. c[1], c[0] = madd2(v, y[5], c[1], t[5])
  303. z[5], z[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1])
  304. }
  305. // if z > q --> z -= q
  306. // note: this is NOT constant time
  307. if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) {
  308. var b uint64
  309. z[0], b = bits.Sub64(z[0], 13402431016077863595, 0)
  310. z[1], b = bits.Sub64(z[1], 2210141511517208575, b)
  311. z[2], b = bits.Sub64(z[2], 7435674573564081700, b)
  312. z[3], b = bits.Sub64(z[3], 7239337960414712511, b)
  313. z[4], b = bits.Sub64(z[4], 5412103778470702295, b)
  314. z[5], _ = bits.Sub64(z[5], 1873798617647539866, b)
  315. }
  316. }
  317. func square(z, x *fe) {
  318. var p [6]uint64
  319. var u, v uint64
  320. {
  321. // round 0
  322. u, p[0] = bits.Mul64(x[0], x[0])
  323. m := p[0] * 9940570264628428797
  324. C := madd0(m, 13402431016077863595, p[0])
  325. var t uint64
  326. t, u, v = madd1sb(x[0], x[1], u)
  327. C, p[0] = madd2(m, 2210141511517208575, v, C)
  328. t, u, v = madd1s(x[0], x[2], t, u)
  329. C, p[1] = madd2(m, 7435674573564081700, v, C)
  330. t, u, v = madd1s(x[0], x[3], t, u)
  331. C, p[2] = madd2(m, 7239337960414712511, v, C)
  332. t, u, v = madd1s(x[0], x[4], t, u)
  333. C, p[3] = madd2(m, 5412103778470702295, v, C)
  334. _, u, v = madd1s(x[0], x[5], t, u)
  335. p[5], p[4] = madd3(m, 1873798617647539866, v, C, u)
  336. }
  337. {
  338. // round 1
  339. m := p[0] * 9940570264628428797
  340. C := madd0(m, 13402431016077863595, p[0])
  341. u, v = madd1(x[1], x[1], p[1])
  342. C, p[0] = madd2(m, 2210141511517208575, v, C)
  343. var t uint64
  344. t, u, v = madd2sb(x[1], x[2], p[2], u)
  345. C, p[1] = madd2(m, 7435674573564081700, v, C)
  346. t, u, v = madd2s(x[1], x[3], p[3], t, u)
  347. C, p[2] = madd2(m, 7239337960414712511, v, C)
  348. t, u, v = madd2s(x[1], x[4], p[4], t, u)
  349. C, p[3] = madd2(m, 5412103778470702295, v, C)
  350. _, u, v = madd2s(x[1], x[5], p[5], t, u)
  351. p[5], p[4] = madd3(m, 1873798617647539866, v, C, u)
  352. }
  353. {
  354. // round 2
  355. m := p[0] * 9940570264628428797
  356. C := madd0(m, 13402431016077863595, p[0])
  357. C, p[0] = madd2(m, 2210141511517208575, p[1], C)
  358. u, v = madd1(x[2], x[2], p[2])
  359. C, p[1] = madd2(m, 7435674573564081700, v, C)
  360. var t uint64
  361. t, u, v = madd2sb(x[2], x[3], p[3], u)
  362. C, p[2] = madd2(m, 7239337960414712511, v, C)
  363. t, u, v = madd2s(x[2], x[4], p[4], t, u)
  364. C, p[3] = madd2(m, 5412103778470702295, v, C)
  365. _, u, v = madd2s(x[2], x[5], p[5], t, u)
  366. p[5], p[4] = madd3(m, 1873798617647539866, v, C, u)
  367. }
  368. {
  369. // round 3
  370. m := p[0] * 9940570264628428797
  371. C := madd0(m, 13402431016077863595, p[0])
  372. C, p[0] = madd2(m, 2210141511517208575, p[1], C)
  373. C, p[1] = madd2(m, 7435674573564081700, p[2], C)
  374. u, v = madd1(x[3], x[3], p[3])
  375. C, p[2] = madd2(m, 7239337960414712511, v, C)
  376. var t uint64
  377. t, u, v = madd2sb(x[3], x[4], p[4], u)
  378. C, p[3] = madd2(m, 5412103778470702295, v, C)
  379. _, u, v = madd2s(x[3], x[5], p[5], t, u)
  380. p[5], p[4] = madd3(m, 1873798617647539866, v, C, u)
  381. }
  382. {
  383. // round 4
  384. m := p[0] * 9940570264628428797
  385. C := madd0(m, 13402431016077863595, p[0])
  386. C, p[0] = madd2(m, 2210141511517208575, p[1], C)
  387. C, p[1] = madd2(m, 7435674573564081700, p[2], C)
  388. C, p[2] = madd2(m, 7239337960414712511, p[3], C)
  389. u, v = madd1(x[4], x[4], p[4])
  390. C, p[3] = madd2(m, 5412103778470702295, v, C)
  391. _, u, v = madd2sb(x[4], x[5], p[5], u)
  392. p[5], p[4] = madd3(m, 1873798617647539866, v, C, u)
  393. }
  394. {
  395. // round 5
  396. m := p[0] * 9940570264628428797
  397. C := madd0(m, 13402431016077863595, p[0])
  398. C, z[0] = madd2(m, 2210141511517208575, p[1], C)
  399. C, z[1] = madd2(m, 7435674573564081700, p[2], C)
  400. C, z[2] = madd2(m, 7239337960414712511, p[3], C)
  401. C, z[3] = madd2(m, 5412103778470702295, p[4], C)
  402. u, v = madd1(x[5], x[5], p[5])
  403. z[5], z[4] = madd3(m, 1873798617647539866, v, C, u)
  404. }
  405. // if z > q --> z -= q
  406. // note: this is NOT constant time
  407. if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) {
  408. var b uint64
  409. z[0], b = bits.Sub64(z[0], 13402431016077863595, 0)
  410. z[1], b = bits.Sub64(z[1], 2210141511517208575, b)
  411. z[2], b = bits.Sub64(z[2], 7435674573564081700, b)
  412. z[3], b = bits.Sub64(z[3], 7239337960414712511, b)
  413. z[4], b = bits.Sub64(z[4], 5412103778470702295, b)
  414. z[5], _ = bits.Sub64(z[5], 1873798617647539866, b)
  415. }
  416. }
  417. // arith.go
  418. // Copyright 2020 ConsenSys AG
  419. //
  420. // Licensed under the Apache License, Version 2.0 (the "License");
  421. // you may not use this file except in compliance with the License.
  422. // You may obtain a copy of the License at
  423. //
  424. // http://www.apache.org/licenses/LICENSE-2.0
  425. //
  426. // Unless required by applicable law or agreed to in writing, software
  427. // distributed under the License is distributed on an "AS IS" BASIS,
  428. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  429. // See the License for the specific language governing permissions and
  430. // limitations under the License.
  431. // Code generated by goff DO NOT EDIT
  432. func madd(a, b, t, u, v uint64) (uint64, uint64, uint64) {
  433. var carry uint64
  434. hi, lo := bits.Mul64(a, b)
  435. v, carry = bits.Add64(lo, v, 0)
  436. u, carry = bits.Add64(hi, u, carry)
  437. t, _ = bits.Add64(t, 0, carry)
  438. return t, u, v
  439. }
  440. // madd0 hi = a*b + c (discards lo bits)
  441. func madd0(a, b, c uint64) (hi uint64) {
  442. var carry, lo uint64
  443. hi, lo = bits.Mul64(a, b)
  444. _, carry = bits.Add64(lo, c, 0)
  445. hi, _ = bits.Add64(hi, 0, carry)
  446. return
  447. }
  448. // madd1 hi, lo = a*b + c
  449. func madd1(a, b, c uint64) (hi uint64, lo uint64) {
  450. var carry uint64
  451. hi, lo = bits.Mul64(a, b)
  452. lo, carry = bits.Add64(lo, c, 0)
  453. hi, _ = bits.Add64(hi, 0, carry)
  454. return
  455. }
  456. // madd2 hi, lo = a*b + c + d
  457. func madd2(a, b, c, d uint64) (hi uint64, lo uint64) {
  458. var carry uint64
  459. hi, lo = bits.Mul64(a, b)
  460. c, carry = bits.Add64(c, d, 0)
  461. hi, _ = bits.Add64(hi, 0, carry)
  462. lo, carry = bits.Add64(lo, c, 0)
  463. hi, _ = bits.Add64(hi, 0, carry)
  464. return
  465. }
  466. // madd2s superhi, hi, lo = 2*a*b + c + d + e
  467. func madd2s(a, b, c, d, e uint64) (superhi, hi, lo uint64) {
  468. var carry, sum uint64
  469. hi, lo = bits.Mul64(a, b)
  470. lo, carry = bits.Add64(lo, lo, 0)
  471. hi, superhi = bits.Add64(hi, hi, carry)
  472. sum, carry = bits.Add64(c, e, 0)
  473. hi, _ = bits.Add64(hi, 0, carry)
  474. lo, carry = bits.Add64(lo, sum, 0)
  475. hi, _ = bits.Add64(hi, 0, carry)
  476. hi, _ = bits.Add64(hi, 0, d)
  477. return
  478. }
  479. func madd1s(a, b, d, e uint64) (superhi, hi, lo uint64) {
  480. var carry uint64
  481. hi, lo = bits.Mul64(a, b)
  482. lo, carry = bits.Add64(lo, lo, 0)
  483. hi, superhi = bits.Add64(hi, hi, carry)
  484. lo, carry = bits.Add64(lo, e, 0)
  485. hi, _ = bits.Add64(hi, 0, carry)
  486. hi, _ = bits.Add64(hi, 0, d)
  487. return
  488. }
  489. func madd2sb(a, b, c, e uint64) (superhi, hi, lo uint64) {
  490. var carry, sum uint64
  491. hi, lo = bits.Mul64(a, b)
  492. lo, carry = bits.Add64(lo, lo, 0)
  493. hi, superhi = bits.Add64(hi, hi, carry)
  494. sum, carry = bits.Add64(c, e, 0)
  495. hi, _ = bits.Add64(hi, 0, carry)
  496. lo, carry = bits.Add64(lo, sum, 0)
  497. hi, _ = bits.Add64(hi, 0, carry)
  498. return
  499. }
  500. func madd1sb(a, b, e uint64) (superhi, hi, lo uint64) {
  501. var carry uint64
  502. hi, lo = bits.Mul64(a, b)
  503. lo, carry = bits.Add64(lo, lo, 0)
  504. hi, superhi = bits.Add64(hi, hi, carry)
  505. lo, carry = bits.Add64(lo, e, 0)
  506. hi, _ = bits.Add64(hi, 0, carry)
  507. return
  508. }
  509. func madd3(a, b, c, d, e uint64) (hi uint64, lo uint64) {
  510. var carry uint64
  511. hi, lo = bits.Mul64(a, b)
  512. c, carry = bits.Add64(c, d, 0)
  513. hi, _ = bits.Add64(hi, 0, carry)
  514. lo, carry = bits.Add64(lo, c, 0)
  515. hi, _ = bits.Add64(hi, e, carry)
  516. return
  517. }