sc.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. #include "fixedint.h"
  2. #include "sc.h"
  3. static uint64_t load_3(const unsigned char *in) {
  4. uint64_t result;
  5. result = (uint64_t) in[0];
  6. result |= ((uint64_t) in[1]) << 8;
  7. result |= ((uint64_t) in[2]) << 16;
  8. return result;
  9. }
  10. static uint64_t load_4(const unsigned char *in) {
  11. uint64_t result;
  12. result = (uint64_t) in[0];
  13. result |= ((uint64_t) in[1]) << 8;
  14. result |= ((uint64_t) in[2]) << 16;
  15. result |= ((uint64_t) in[3]) << 24;
  16. return result;
  17. }
  18. /*
  19. Input:
  20. s[0]+256*s[1]+...+256^63*s[63] = s
  21. Output:
  22. s[0]+256*s[1]+...+256^31*s[31] = s mod l
  23. where l = 2^252 + 27742317777372353535851937790883648493.
  24. Overwrites s in place.
  25. */
  26. void sc_reduce(unsigned char *s) {
  27. int64_t s0 = 2097151 & load_3(s);
  28. int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
  29. int64_t s2 = 2097151 & (load_3(s + 5) >> 2);
  30. int64_t s3 = 2097151 & (load_4(s + 7) >> 7);
  31. int64_t s4 = 2097151 & (load_4(s + 10) >> 4);
  32. int64_t s5 = 2097151 & (load_3(s + 13) >> 1);
  33. int64_t s6 = 2097151 & (load_4(s + 15) >> 6);
  34. int64_t s7 = 2097151 & (load_3(s + 18) >> 3);
  35. int64_t s8 = 2097151 & load_3(s + 21);
  36. int64_t s9 = 2097151 & (load_4(s + 23) >> 5);
  37. int64_t s10 = 2097151 & (load_3(s + 26) >> 2);
  38. int64_t s11 = 2097151 & (load_4(s + 28) >> 7);
  39. int64_t s12 = 2097151 & (load_4(s + 31) >> 4);
  40. int64_t s13 = 2097151 & (load_3(s + 34) >> 1);
  41. int64_t s14 = 2097151 & (load_4(s + 36) >> 6);
  42. int64_t s15 = 2097151 & (load_3(s + 39) >> 3);
  43. int64_t s16 = 2097151 & load_3(s + 42);
  44. int64_t s17 = 2097151 & (load_4(s + 44) >> 5);
  45. int64_t s18 = 2097151 & (load_3(s + 47) >> 2);
  46. int64_t s19 = 2097151 & (load_4(s + 49) >> 7);
  47. int64_t s20 = 2097151 & (load_4(s + 52) >> 4);
  48. int64_t s21 = 2097151 & (load_3(s + 55) >> 1);
  49. int64_t s22 = 2097151 & (load_4(s + 57) >> 6);
  50. int64_t s23 = (load_4(s + 60) >> 3);
  51. int64_t carry0;
  52. int64_t carry1;
  53. int64_t carry2;
  54. int64_t carry3;
  55. int64_t carry4;
  56. int64_t carry5;
  57. int64_t carry6;
  58. int64_t carry7;
  59. int64_t carry8;
  60. int64_t carry9;
  61. int64_t carry10;
  62. int64_t carry11;
  63. int64_t carry12;
  64. int64_t carry13;
  65. int64_t carry14;
  66. int64_t carry15;
  67. int64_t carry16;
  68. s11 += s23 * 666643;
  69. s12 += s23 * 470296;
  70. s13 += s23 * 654183;
  71. s14 -= s23 * 997805;
  72. s15 += s23 * 136657;
  73. s16 -= s23 * 683901;
  74. s23 = 0;
  75. s10 += s22 * 666643;
  76. s11 += s22 * 470296;
  77. s12 += s22 * 654183;
  78. s13 -= s22 * 997805;
  79. s14 += s22 * 136657;
  80. s15 -= s22 * 683901;
  81. s22 = 0;
  82. s9 += s21 * 666643;
  83. s10 += s21 * 470296;
  84. s11 += s21 * 654183;
  85. s12 -= s21 * 997805;
  86. s13 += s21 * 136657;
  87. s14 -= s21 * 683901;
  88. s21 = 0;
  89. s8 += s20 * 666643;
  90. s9 += s20 * 470296;
  91. s10 += s20 * 654183;
  92. s11 -= s20 * 997805;
  93. s12 += s20 * 136657;
  94. s13 -= s20 * 683901;
  95. s20 = 0;
  96. s7 += s19 * 666643;
  97. s8 += s19 * 470296;
  98. s9 += s19 * 654183;
  99. s10 -= s19 * 997805;
  100. s11 += s19 * 136657;
  101. s12 -= s19 * 683901;
  102. s19 = 0;
  103. s6 += s18 * 666643;
  104. s7 += s18 * 470296;
  105. s8 += s18 * 654183;
  106. s9 -= s18 * 997805;
  107. s10 += s18 * 136657;
  108. s11 -= s18 * 683901;
  109. s18 = 0;
  110. carry6 = (s6 + (1 << 20)) >> 21;
  111. s7 += carry6;
  112. s6 -= carry6 << 21;
  113. carry8 = (s8 + (1 << 20)) >> 21;
  114. s9 += carry8;
  115. s8 -= carry8 << 21;
  116. carry10 = (s10 + (1 << 20)) >> 21;
  117. s11 += carry10;
  118. s10 -= carry10 << 21;
  119. carry12 = (s12 + (1 << 20)) >> 21;
  120. s13 += carry12;
  121. s12 -= carry12 << 21;
  122. carry14 = (s14 + (1 << 20)) >> 21;
  123. s15 += carry14;
  124. s14 -= carry14 << 21;
  125. carry16 = (s16 + (1 << 20)) >> 21;
  126. s17 += carry16;
  127. s16 -= carry16 << 21;
  128. carry7 = (s7 + (1 << 20)) >> 21;
  129. s8 += carry7;
  130. s7 -= carry7 << 21;
  131. carry9 = (s9 + (1 << 20)) >> 21;
  132. s10 += carry9;
  133. s9 -= carry9 << 21;
  134. carry11 = (s11 + (1 << 20)) >> 21;
  135. s12 += carry11;
  136. s11 -= carry11 << 21;
  137. carry13 = (s13 + (1 << 20)) >> 21;
  138. s14 += carry13;
  139. s13 -= carry13 << 21;
  140. carry15 = (s15 + (1 << 20)) >> 21;
  141. s16 += carry15;
  142. s15 -= carry15 << 21;
  143. s5 += s17 * 666643;
  144. s6 += s17 * 470296;
  145. s7 += s17 * 654183;
  146. s8 -= s17 * 997805;
  147. s9 += s17 * 136657;
  148. s10 -= s17 * 683901;
  149. s17 = 0;
  150. s4 += s16 * 666643;
  151. s5 += s16 * 470296;
  152. s6 += s16 * 654183;
  153. s7 -= s16 * 997805;
  154. s8 += s16 * 136657;
  155. s9 -= s16 * 683901;
  156. s16 = 0;
  157. s3 += s15 * 666643;
  158. s4 += s15 * 470296;
  159. s5 += s15 * 654183;
  160. s6 -= s15 * 997805;
  161. s7 += s15 * 136657;
  162. s8 -= s15 * 683901;
  163. s15 = 0;
  164. s2 += s14 * 666643;
  165. s3 += s14 * 470296;
  166. s4 += s14 * 654183;
  167. s5 -= s14 * 997805;
  168. s6 += s14 * 136657;
  169. s7 -= s14 * 683901;
  170. s14 = 0;
  171. s1 += s13 * 666643;
  172. s2 += s13 * 470296;
  173. s3 += s13 * 654183;
  174. s4 -= s13 * 997805;
  175. s5 += s13 * 136657;
  176. s6 -= s13 * 683901;
  177. s13 = 0;
  178. s0 += s12 * 666643;
  179. s1 += s12 * 470296;
  180. s2 += s12 * 654183;
  181. s3 -= s12 * 997805;
  182. s4 += s12 * 136657;
  183. s5 -= s12 * 683901;
  184. s12 = 0;
  185. carry0 = (s0 + (1 << 20)) >> 21;
  186. s1 += carry0;
  187. s0 -= carry0 << 21;
  188. carry2 = (s2 + (1 << 20)) >> 21;
  189. s3 += carry2;
  190. s2 -= carry2 << 21;
  191. carry4 = (s4 + (1 << 20)) >> 21;
  192. s5 += carry4;
  193. s4 -= carry4 << 21;
  194. carry6 = (s6 + (1 << 20)) >> 21;
  195. s7 += carry6;
  196. s6 -= carry6 << 21;
  197. carry8 = (s8 + (1 << 20)) >> 21;
  198. s9 += carry8;
  199. s8 -= carry8 << 21;
  200. carry10 = (s10 + (1 << 20)) >> 21;
  201. s11 += carry10;
  202. s10 -= carry10 << 21;
  203. carry1 = (s1 + (1 << 20)) >> 21;
  204. s2 += carry1;
  205. s1 -= carry1 << 21;
  206. carry3 = (s3 + (1 << 20)) >> 21;
  207. s4 += carry3;
  208. s3 -= carry3 << 21;
  209. carry5 = (s5 + (1 << 20)) >> 21;
  210. s6 += carry5;
  211. s5 -= carry5 << 21;
  212. carry7 = (s7 + (1 << 20)) >> 21;
  213. s8 += carry7;
  214. s7 -= carry7 << 21;
  215. carry9 = (s9 + (1 << 20)) >> 21;
  216. s10 += carry9;
  217. s9 -= carry9 << 21;
  218. carry11 = (s11 + (1 << 20)) >> 21;
  219. s12 += carry11;
  220. s11 -= carry11 << 21;
  221. s0 += s12 * 666643;
  222. s1 += s12 * 470296;
  223. s2 += s12 * 654183;
  224. s3 -= s12 * 997805;
  225. s4 += s12 * 136657;
  226. s5 -= s12 * 683901;
  227. s12 = 0;
  228. carry0 = s0 >> 21;
  229. s1 += carry0;
  230. s0 -= carry0 << 21;
  231. carry1 = s1 >> 21;
  232. s2 += carry1;
  233. s1 -= carry1 << 21;
  234. carry2 = s2 >> 21;
  235. s3 += carry2;
  236. s2 -= carry2 << 21;
  237. carry3 = s3 >> 21;
  238. s4 += carry3;
  239. s3 -= carry3 << 21;
  240. carry4 = s4 >> 21;
  241. s5 += carry4;
  242. s4 -= carry4 << 21;
  243. carry5 = s5 >> 21;
  244. s6 += carry5;
  245. s5 -= carry5 << 21;
  246. carry6 = s6 >> 21;
  247. s7 += carry6;
  248. s6 -= carry6 << 21;
  249. carry7 = s7 >> 21;
  250. s8 += carry7;
  251. s7 -= carry7 << 21;
  252. carry8 = s8 >> 21;
  253. s9 += carry8;
  254. s8 -= carry8 << 21;
  255. carry9 = s9 >> 21;
  256. s10 += carry9;
  257. s9 -= carry9 << 21;
  258. carry10 = s10 >> 21;
  259. s11 += carry10;
  260. s10 -= carry10 << 21;
  261. carry11 = s11 >> 21;
  262. s12 += carry11;
  263. s11 -= carry11 << 21;
  264. s0 += s12 * 666643;
  265. s1 += s12 * 470296;
  266. s2 += s12 * 654183;
  267. s3 -= s12 * 997805;
  268. s4 += s12 * 136657;
  269. s5 -= s12 * 683901;
  270. s12 = 0;
  271. carry0 = s0 >> 21;
  272. s1 += carry0;
  273. s0 -= carry0 << 21;
  274. carry1 = s1 >> 21;
  275. s2 += carry1;
  276. s1 -= carry1 << 21;
  277. carry2 = s2 >> 21;
  278. s3 += carry2;
  279. s2 -= carry2 << 21;
  280. carry3 = s3 >> 21;
  281. s4 += carry3;
  282. s3 -= carry3 << 21;
  283. carry4 = s4 >> 21;
  284. s5 += carry4;
  285. s4 -= carry4 << 21;
  286. carry5 = s5 >> 21;
  287. s6 += carry5;
  288. s5 -= carry5 << 21;
  289. carry6 = s6 >> 21;
  290. s7 += carry6;
  291. s6 -= carry6 << 21;
  292. carry7 = s7 >> 21;
  293. s8 += carry7;
  294. s7 -= carry7 << 21;
  295. carry8 = s8 >> 21;
  296. s9 += carry8;
  297. s8 -= carry8 << 21;
  298. carry9 = s9 >> 21;
  299. s10 += carry9;
  300. s9 -= carry9 << 21;
  301. carry10 = s10 >> 21;
  302. s11 += carry10;
  303. s10 -= carry10 << 21;
  304. s[0] = (unsigned char) (s0 >> 0);
  305. s[1] = (unsigned char) (s0 >> 8);
  306. s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5));
  307. s[3] = (unsigned char) (s1 >> 3);
  308. s[4] = (unsigned char) (s1 >> 11);
  309. s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2));
  310. s[6] = (unsigned char) (s2 >> 6);
  311. s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7));
  312. s[8] = (unsigned char) (s3 >> 1);
  313. s[9] = (unsigned char) (s3 >> 9);
  314. s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4));
  315. s[11] = (unsigned char) (s4 >> 4);
  316. s[12] = (unsigned char) (s4 >> 12);
  317. s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1));
  318. s[14] = (unsigned char) (s5 >> 7);
  319. s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6));
  320. s[16] = (unsigned char) (s6 >> 2);
  321. s[17] = (unsigned char) (s6 >> 10);
  322. s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3));
  323. s[19] = (unsigned char) (s7 >> 5);
  324. s[20] = (unsigned char) (s7 >> 13);
  325. s[21] = (unsigned char) (s8 >> 0);
  326. s[22] = (unsigned char) (s8 >> 8);
  327. s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5));
  328. s[24] = (unsigned char) (s9 >> 3);
  329. s[25] = (unsigned char) (s9 >> 11);
  330. s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2));
  331. s[27] = (unsigned char) (s10 >> 6);
  332. s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7));
  333. s[29] = (unsigned char) (s11 >> 1);
  334. s[30] = (unsigned char) (s11 >> 9);
  335. s[31] = (unsigned char) (s11 >> 17);
  336. }
  337. /*
  338. Input:
  339. a[0]+256*a[1]+...+256^31*a[31] = a
  340. b[0]+256*b[1]+...+256^31*b[31] = b
  341. c[0]+256*c[1]+...+256^31*c[31] = c
  342. Output:
  343. s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
  344. where l = 2^252 + 27742317777372353535851937790883648493.
  345. */
  346. void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) {
  347. int64_t a0 = 2097151 & load_3(a);
  348. int64_t a1 = 2097151 & (load_4(a + 2) >> 5);
  349. int64_t a2 = 2097151 & (load_3(a + 5) >> 2);
  350. int64_t a3 = 2097151 & (load_4(a + 7) >> 7);
  351. int64_t a4 = 2097151 & (load_4(a + 10) >> 4);
  352. int64_t a5 = 2097151 & (load_3(a + 13) >> 1);
  353. int64_t a6 = 2097151 & (load_4(a + 15) >> 6);
  354. int64_t a7 = 2097151 & (load_3(a + 18) >> 3);
  355. int64_t a8 = 2097151 & load_3(a + 21);
  356. int64_t a9 = 2097151 & (load_4(a + 23) >> 5);
  357. int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
  358. int64_t a11 = (load_4(a + 28) >> 7);
  359. int64_t b0 = 2097151 & load_3(b);
  360. int64_t b1 = 2097151 & (load_4(b + 2) >> 5);
  361. int64_t b2 = 2097151 & (load_3(b + 5) >> 2);
  362. int64_t b3 = 2097151 & (load_4(b + 7) >> 7);
  363. int64_t b4 = 2097151 & (load_4(b + 10) >> 4);
  364. int64_t b5 = 2097151 & (load_3(b + 13) >> 1);
  365. int64_t b6 = 2097151 & (load_4(b + 15) >> 6);
  366. int64_t b7 = 2097151 & (load_3(b + 18) >> 3);
  367. int64_t b8 = 2097151 & load_3(b + 21);
  368. int64_t b9 = 2097151 & (load_4(b + 23) >> 5);
  369. int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
  370. int64_t b11 = (load_4(b + 28) >> 7);
  371. int64_t c0 = 2097151 & load_3(c);
  372. int64_t c1 = 2097151 & (load_4(c + 2) >> 5);
  373. int64_t c2 = 2097151 & (load_3(c + 5) >> 2);
  374. int64_t c3 = 2097151 & (load_4(c + 7) >> 7);
  375. int64_t c4 = 2097151 & (load_4(c + 10) >> 4);
  376. int64_t c5 = 2097151 & (load_3(c + 13) >> 1);
  377. int64_t c6 = 2097151 & (load_4(c + 15) >> 6);
  378. int64_t c7 = 2097151 & (load_3(c + 18) >> 3);
  379. int64_t c8 = 2097151 & load_3(c + 21);
  380. int64_t c9 = 2097151 & (load_4(c + 23) >> 5);
  381. int64_t c10 = 2097151 & (load_3(c + 26) >> 2);
  382. int64_t c11 = (load_4(c + 28) >> 7);
  383. int64_t s0;
  384. int64_t s1;
  385. int64_t s2;
  386. int64_t s3;
  387. int64_t s4;
  388. int64_t s5;
  389. int64_t s6;
  390. int64_t s7;
  391. int64_t s8;
  392. int64_t s9;
  393. int64_t s10;
  394. int64_t s11;
  395. int64_t s12;
  396. int64_t s13;
  397. int64_t s14;
  398. int64_t s15;
  399. int64_t s16;
  400. int64_t s17;
  401. int64_t s18;
  402. int64_t s19;
  403. int64_t s20;
  404. int64_t s21;
  405. int64_t s22;
  406. int64_t s23;
  407. int64_t carry0;
  408. int64_t carry1;
  409. int64_t carry2;
  410. int64_t carry3;
  411. int64_t carry4;
  412. int64_t carry5;
  413. int64_t carry6;
  414. int64_t carry7;
  415. int64_t carry8;
  416. int64_t carry9;
  417. int64_t carry10;
  418. int64_t carry11;
  419. int64_t carry12;
  420. int64_t carry13;
  421. int64_t carry14;
  422. int64_t carry15;
  423. int64_t carry16;
  424. int64_t carry17;
  425. int64_t carry18;
  426. int64_t carry19;
  427. int64_t carry20;
  428. int64_t carry21;
  429. int64_t carry22;
  430. s0 = c0 + a0 * b0;
  431. s1 = c1 + a0 * b1 + a1 * b0;
  432. s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0;
  433. s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
  434. s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
  435. s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
  436. s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
  437. s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0;
  438. s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0;
  439. s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
  440. s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
  441. s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
  442. s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
  443. s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2;
  444. s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3;
  445. s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4;
  446. s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
  447. s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
  448. s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
  449. s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
  450. s20 = a9 * b11 + a10 * b10 + a11 * b9;
  451. s21 = a10 * b11 + a11 * b10;
  452. s22 = a11 * b11;
  453. s23 = 0;
  454. carry0 = (s0 + (1 << 20)) >> 21;
  455. s1 += carry0;
  456. s0 -= carry0 << 21;
  457. carry2 = (s2 + (1 << 20)) >> 21;
  458. s3 += carry2;
  459. s2 -= carry2 << 21;
  460. carry4 = (s4 + (1 << 20)) >> 21;
  461. s5 += carry4;
  462. s4 -= carry4 << 21;
  463. carry6 = (s6 + (1 << 20)) >> 21;
  464. s7 += carry6;
  465. s6 -= carry6 << 21;
  466. carry8 = (s8 + (1 << 20)) >> 21;
  467. s9 += carry8;
  468. s8 -= carry8 << 21;
  469. carry10 = (s10 + (1 << 20)) >> 21;
  470. s11 += carry10;
  471. s10 -= carry10 << 21;
  472. carry12 = (s12 + (1 << 20)) >> 21;
  473. s13 += carry12;
  474. s12 -= carry12 << 21;
  475. carry14 = (s14 + (1 << 20)) >> 21;
  476. s15 += carry14;
  477. s14 -= carry14 << 21;
  478. carry16 = (s16 + (1 << 20)) >> 21;
  479. s17 += carry16;
  480. s16 -= carry16 << 21;
  481. carry18 = (s18 + (1 << 20)) >> 21;
  482. s19 += carry18;
  483. s18 -= carry18 << 21;
  484. carry20 = (s20 + (1 << 20)) >> 21;
  485. s21 += carry20;
  486. s20 -= carry20 << 21;
  487. carry22 = (s22 + (1 << 20)) >> 21;
  488. s23 += carry22;
  489. s22 -= carry22 << 21;
  490. carry1 = (s1 + (1 << 20)) >> 21;
  491. s2 += carry1;
  492. s1 -= carry1 << 21;
  493. carry3 = (s3 + (1 << 20)) >> 21;
  494. s4 += carry3;
  495. s3 -= carry3 << 21;
  496. carry5 = (s5 + (1 << 20)) >> 21;
  497. s6 += carry5;
  498. s5 -= carry5 << 21;
  499. carry7 = (s7 + (1 << 20)) >> 21;
  500. s8 += carry7;
  501. s7 -= carry7 << 21;
  502. carry9 = (s9 + (1 << 20)) >> 21;
  503. s10 += carry9;
  504. s9 -= carry9 << 21;
  505. carry11 = (s11 + (1 << 20)) >> 21;
  506. s12 += carry11;
  507. s11 -= carry11 << 21;
  508. carry13 = (s13 + (1 << 20)) >> 21;
  509. s14 += carry13;
  510. s13 -= carry13 << 21;
  511. carry15 = (s15 + (1 << 20)) >> 21;
  512. s16 += carry15;
  513. s15 -= carry15 << 21;
  514. carry17 = (s17 + (1 << 20)) >> 21;
  515. s18 += carry17;
  516. s17 -= carry17 << 21;
  517. carry19 = (s19 + (1 << 20)) >> 21;
  518. s20 += carry19;
  519. s19 -= carry19 << 21;
  520. carry21 = (s21 + (1 << 20)) >> 21;
  521. s22 += carry21;
  522. s21 -= carry21 << 21;
  523. s11 += s23 * 666643;
  524. s12 += s23 * 470296;
  525. s13 += s23 * 654183;
  526. s14 -= s23 * 997805;
  527. s15 += s23 * 136657;
  528. s16 -= s23 * 683901;
  529. s23 = 0;
  530. s10 += s22 * 666643;
  531. s11 += s22 * 470296;
  532. s12 += s22 * 654183;
  533. s13 -= s22 * 997805;
  534. s14 += s22 * 136657;
  535. s15 -= s22 * 683901;
  536. s22 = 0;
  537. s9 += s21 * 666643;
  538. s10 += s21 * 470296;
  539. s11 += s21 * 654183;
  540. s12 -= s21 * 997805;
  541. s13 += s21 * 136657;
  542. s14 -= s21 * 683901;
  543. s21 = 0;
  544. s8 += s20 * 666643;
  545. s9 += s20 * 470296;
  546. s10 += s20 * 654183;
  547. s11 -= s20 * 997805;
  548. s12 += s20 * 136657;
  549. s13 -= s20 * 683901;
  550. s20 = 0;
  551. s7 += s19 * 666643;
  552. s8 += s19 * 470296;
  553. s9 += s19 * 654183;
  554. s10 -= s19 * 997805;
  555. s11 += s19 * 136657;
  556. s12 -= s19 * 683901;
  557. s19 = 0;
  558. s6 += s18 * 666643;
  559. s7 += s18 * 470296;
  560. s8 += s18 * 654183;
  561. s9 -= s18 * 997805;
  562. s10 += s18 * 136657;
  563. s11 -= s18 * 683901;
  564. s18 = 0;
  565. carry6 = (s6 + (1 << 20)) >> 21;
  566. s7 += carry6;
  567. s6 -= carry6 << 21;
  568. carry8 = (s8 + (1 << 20)) >> 21;
  569. s9 += carry8;
  570. s8 -= carry8 << 21;
  571. carry10 = (s10 + (1 << 20)) >> 21;
  572. s11 += carry10;
  573. s10 -= carry10 << 21;
  574. carry12 = (s12 + (1 << 20)) >> 21;
  575. s13 += carry12;
  576. s12 -= carry12 << 21;
  577. carry14 = (s14 + (1 << 20)) >> 21;
  578. s15 += carry14;
  579. s14 -= carry14 << 21;
  580. carry16 = (s16 + (1 << 20)) >> 21;
  581. s17 += carry16;
  582. s16 -= carry16 << 21;
  583. carry7 = (s7 + (1 << 20)) >> 21;
  584. s8 += carry7;
  585. s7 -= carry7 << 21;
  586. carry9 = (s9 + (1 << 20)) >> 21;
  587. s10 += carry9;
  588. s9 -= carry9 << 21;
  589. carry11 = (s11 + (1 << 20)) >> 21;
  590. s12 += carry11;
  591. s11 -= carry11 << 21;
  592. carry13 = (s13 + (1 << 20)) >> 21;
  593. s14 += carry13;
  594. s13 -= carry13 << 21;
  595. carry15 = (s15 + (1 << 20)) >> 21;
  596. s16 += carry15;
  597. s15 -= carry15 << 21;
  598. s5 += s17 * 666643;
  599. s6 += s17 * 470296;
  600. s7 += s17 * 654183;
  601. s8 -= s17 * 997805;
  602. s9 += s17 * 136657;
  603. s10 -= s17 * 683901;
  604. s17 = 0;
  605. s4 += s16 * 666643;
  606. s5 += s16 * 470296;
  607. s6 += s16 * 654183;
  608. s7 -= s16 * 997805;
  609. s8 += s16 * 136657;
  610. s9 -= s16 * 683901;
  611. s16 = 0;
  612. s3 += s15 * 666643;
  613. s4 += s15 * 470296;
  614. s5 += s15 * 654183;
  615. s6 -= s15 * 997805;
  616. s7 += s15 * 136657;
  617. s8 -= s15 * 683901;
  618. s15 = 0;
  619. s2 += s14 * 666643;
  620. s3 += s14 * 470296;
  621. s4 += s14 * 654183;
  622. s5 -= s14 * 997805;
  623. s6 += s14 * 136657;
  624. s7 -= s14 * 683901;
  625. s14 = 0;
  626. s1 += s13 * 666643;
  627. s2 += s13 * 470296;
  628. s3 += s13 * 654183;
  629. s4 -= s13 * 997805;
  630. s5 += s13 * 136657;
  631. s6 -= s13 * 683901;
  632. s13 = 0;
  633. s0 += s12 * 666643;
  634. s1 += s12 * 470296;
  635. s2 += s12 * 654183;
  636. s3 -= s12 * 997805;
  637. s4 += s12 * 136657;
  638. s5 -= s12 * 683901;
  639. s12 = 0;
  640. carry0 = (s0 + (1 << 20)) >> 21;
  641. s1 += carry0;
  642. s0 -= carry0 << 21;
  643. carry2 = (s2 + (1 << 20)) >> 21;
  644. s3 += carry2;
  645. s2 -= carry2 << 21;
  646. carry4 = (s4 + (1 << 20)) >> 21;
  647. s5 += carry4;
  648. s4 -= carry4 << 21;
  649. carry6 = (s6 + (1 << 20)) >> 21;
  650. s7 += carry6;
  651. s6 -= carry6 << 21;
  652. carry8 = (s8 + (1 << 20)) >> 21;
  653. s9 += carry8;
  654. s8 -= carry8 << 21;
  655. carry10 = (s10 + (1 << 20)) >> 21;
  656. s11 += carry10;
  657. s10 -= carry10 << 21;
  658. carry1 = (s1 + (1 << 20)) >> 21;
  659. s2 += carry1;
  660. s1 -= carry1 << 21;
  661. carry3 = (s3 + (1 << 20)) >> 21;
  662. s4 += carry3;
  663. s3 -= carry3 << 21;
  664. carry5 = (s5 + (1 << 20)) >> 21;
  665. s6 += carry5;
  666. s5 -= carry5 << 21;
  667. carry7 = (s7 + (1 << 20)) >> 21;
  668. s8 += carry7;
  669. s7 -= carry7 << 21;
  670. carry9 = (s9 + (1 << 20)) >> 21;
  671. s10 += carry9;
  672. s9 -= carry9 << 21;
  673. carry11 = (s11 + (1 << 20)) >> 21;
  674. s12 += carry11;
  675. s11 -= carry11 << 21;
  676. s0 += s12 * 666643;
  677. s1 += s12 * 470296;
  678. s2 += s12 * 654183;
  679. s3 -= s12 * 997805;
  680. s4 += s12 * 136657;
  681. s5 -= s12 * 683901;
  682. s12 = 0;
  683. carry0 = s0 >> 21;
  684. s1 += carry0;
  685. s0 -= carry0 << 21;
  686. carry1 = s1 >> 21;
  687. s2 += carry1;
  688. s1 -= carry1 << 21;
  689. carry2 = s2 >> 21;
  690. s3 += carry2;
  691. s2 -= carry2 << 21;
  692. carry3 = s3 >> 21;
  693. s4 += carry3;
  694. s3 -= carry3 << 21;
  695. carry4 = s4 >> 21;
  696. s5 += carry4;
  697. s4 -= carry4 << 21;
  698. carry5 = s5 >> 21;
  699. s6 += carry5;
  700. s5 -= carry5 << 21;
  701. carry6 = s6 >> 21;
  702. s7 += carry6;
  703. s6 -= carry6 << 21;
  704. carry7 = s7 >> 21;
  705. s8 += carry7;
  706. s7 -= carry7 << 21;
  707. carry8 = s8 >> 21;
  708. s9 += carry8;
  709. s8 -= carry8 << 21;
  710. carry9 = s9 >> 21;
  711. s10 += carry9;
  712. s9 -= carry9 << 21;
  713. carry10 = s10 >> 21;
  714. s11 += carry10;
  715. s10 -= carry10 << 21;
  716. carry11 = s11 >> 21;
  717. s12 += carry11;
  718. s11 -= carry11 << 21;
  719. s0 += s12 * 666643;
  720. s1 += s12 * 470296;
  721. s2 += s12 * 654183;
  722. s3 -= s12 * 997805;
  723. s4 += s12 * 136657;
  724. s5 -= s12 * 683901;
  725. s12 = 0;
  726. carry0 = s0 >> 21;
  727. s1 += carry0;
  728. s0 -= carry0 << 21;
  729. carry1 = s1 >> 21;
  730. s2 += carry1;
  731. s1 -= carry1 << 21;
  732. carry2 = s2 >> 21;
  733. s3 += carry2;
  734. s2 -= carry2 << 21;
  735. carry3 = s3 >> 21;
  736. s4 += carry3;
  737. s3 -= carry3 << 21;
  738. carry4 = s4 >> 21;
  739. s5 += carry4;
  740. s4 -= carry4 << 21;
  741. carry5 = s5 >> 21;
  742. s6 += carry5;
  743. s5 -= carry5 << 21;
  744. carry6 = s6 >> 21;
  745. s7 += carry6;
  746. s6 -= carry6 << 21;
  747. carry7 = s7 >> 21;
  748. s8 += carry7;
  749. s7 -= carry7 << 21;
  750. carry8 = s8 >> 21;
  751. s9 += carry8;
  752. s8 -= carry8 << 21;
  753. carry9 = s9 >> 21;
  754. s10 += carry9;
  755. s9 -= carry9 << 21;
  756. carry10 = s10 >> 21;
  757. s11 += carry10;
  758. s10 -= carry10 << 21;
  759. s[0] = (unsigned char) (s0 >> 0);
  760. s[1] = (unsigned char) (s0 >> 8);
  761. s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5));
  762. s[3] = (unsigned char) (s1 >> 3);
  763. s[4] = (unsigned char) (s1 >> 11);
  764. s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2));
  765. s[6] = (unsigned char) (s2 >> 6);
  766. s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7));
  767. s[8] = (unsigned char) (s3 >> 1);
  768. s[9] = (unsigned char) (s3 >> 9);
  769. s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4));
  770. s[11] = (unsigned char) (s4 >> 4);
  771. s[12] = (unsigned char) (s4 >> 12);
  772. s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1));
  773. s[14] = (unsigned char) (s5 >> 7);
  774. s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6));
  775. s[16] = (unsigned char) (s6 >> 2);
  776. s[17] = (unsigned char) (s6 >> 10);
  777. s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3));
  778. s[19] = (unsigned char) (s7 >> 5);
  779. s[20] = (unsigned char) (s7 >> 13);
  780. s[21] = (unsigned char) (s8 >> 0);
  781. s[22] = (unsigned char) (s8 >> 8);
  782. s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5));
  783. s[24] = (unsigned char) (s9 >> 3);
  784. s[25] = (unsigned char) (s9 >> 11);
  785. s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2));
  786. s[27] = (unsigned char) (s10 >> 6);
  787. s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7));
  788. s[29] = (unsigned char) (s11 >> 1);
  789. s[30] = (unsigned char) (s11 >> 9);
  790. s[31] = (unsigned char) (s11 >> 17);
  791. }