arithmetic_fallback.go 20 KB

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