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.
 
 
 
 
 

957 lines
28 KiB

  1. /**
  2. * @cond internal
  3. * @file ec_point.c
  4. * @copyright
  5. * Copyright (c) 2014 Cryptography Research, Inc. \n
  6. * Released under the MIT License. See LICENSE.txt for license information.
  7. * @author Mike Hamburg
  8. * @warning This file was automatically generated.
  9. * Then it was edited by hand. Good luck, have fun.
  10. */
  11. #include "ec_point.h"
  12. #include "magic.h"
  13. #define is32 (GOLDI_BITS == 32)
  14. /* I wanted to just use if (is32)
  15. * But clang's -Wunreachable-code flags it.
  16. * I wanted to keep that warning on.
  17. */
  18. #if (is32)
  19. #define IF32(s) (s)
  20. #else
  21. #define IF32(s)
  22. #endif
  23. /* Multiply by signed curve constant */
  24. static __inline__ void
  25. field_mulw_scc (
  26. struct field_t* __restrict__ out,
  27. const struct field_t *a,
  28. int64_t scc
  29. ) {
  30. if (scc >= 0) {
  31. field_mulw(out, a, scc);
  32. } else {
  33. field_mulw(out, a, -scc);
  34. field_neg(out,out);
  35. field_bias(out,2);
  36. }
  37. }
  38. /* Multiply by signed curve constant and weak reduce if biased */
  39. static __inline__ void
  40. field_mulw_scc_wr (
  41. struct field_t* __restrict__ out,
  42. const struct field_t *a,
  43. int64_t scc
  44. ) {
  45. field_mulw_scc(out, a, scc);
  46. if (scc < 0)
  47. field_weak_reduce(out);
  48. }
  49. void
  50. field_isr (
  51. struct field_t* a,
  52. const struct field_t* x
  53. ) {
  54. struct field_t L0, L1, L2;
  55. field_sqr ( &L1, x );
  56. field_mul ( &L2, x, &L1 );
  57. field_sqr ( &L1, &L2 );
  58. field_mul ( &L2, x, &L1 );
  59. field_sqrn ( &L1, &L2, 3 );
  60. field_mul ( &L0, &L2, &L1 );
  61. field_sqrn ( &L1, &L0, 3 );
  62. field_mul ( &L0, &L2, &L1 );
  63. field_sqrn ( &L2, &L0, 9 );
  64. field_mul ( &L1, &L0, &L2 );
  65. field_sqr ( &L0, &L1 );
  66. field_mul ( &L2, x, &L0 );
  67. field_sqrn ( &L0, &L2, 18 );
  68. field_mul ( &L2, &L1, &L0 );
  69. field_sqrn ( &L0, &L2, 37 );
  70. field_mul ( &L1, &L2, &L0 );
  71. field_sqrn ( &L0, &L1, 37 );
  72. field_mul ( &L1, &L2, &L0 );
  73. field_sqrn ( &L0, &L1, 111 );
  74. field_mul ( &L2, &L1, &L0 );
  75. field_sqr ( &L0, &L2 );
  76. field_mul ( &L1, x, &L0 );
  77. field_sqrn ( &L0, &L1, 223 );
  78. field_mul ( a, &L2, &L0 );
  79. }
  80. void
  81. add_tw_niels_to_tw_extensible (
  82. struct tw_extensible_t* d,
  83. const struct tw_niels_t* e
  84. ) {
  85. struct field_t L0, L1;
  86. field_sub ( &L1, &d->y, &d->x );
  87. field_bias ( &L1, 2 );
  88. IF32( field_weak_reduce( &L1 ) );
  89. field_mul ( &L0, &e->a, &L1 );
  90. field_add ( &L1, &d->x, &d->y );
  91. field_mul ( &d->y, &e->b, &L1 );
  92. field_mul ( &L1, &d->u, &d->t );
  93. field_mul ( &d->x, &e->c, &L1 );
  94. field_add ( &d->u, &L0, &d->y );
  95. field_sub ( &d->t, &d->y, &L0 );
  96. field_bias ( &d->t, 2 );
  97. IF32( field_weak_reduce( &d->t ) );
  98. field_sub ( &d->y, &d->z, &d->x );
  99. field_bias ( &d->y, 2 );
  100. IF32( field_weak_reduce( &d->y ) );
  101. field_add ( &L0, &d->x, &d->z );
  102. field_mul ( &d->z, &L0, &d->y );
  103. field_mul ( &d->x, &d->y, &d->t );
  104. field_mul ( &d->y, &L0, &d->u );
  105. }
  106. void
  107. sub_tw_niels_from_tw_extensible (
  108. struct tw_extensible_t* d,
  109. const struct tw_niels_t* e
  110. ) {
  111. struct field_t L0, L1;
  112. field_sub ( &L1, &d->y, &d->x );
  113. field_bias ( &L1, 2 );
  114. IF32( field_weak_reduce( &L1 ) );
  115. field_mul ( &L0, &e->b, &L1 );
  116. field_add ( &L1, &d->x, &d->y );
  117. field_mul ( &d->y, &e->a, &L1 );
  118. field_mul ( &L1, &d->u, &d->t );
  119. field_mul ( &d->x, &e->c, &L1 );
  120. field_add ( &d->u, &L0, &d->y );
  121. field_sub ( &d->t, &d->y, &L0 );
  122. field_bias ( &d->t, 2 );
  123. IF32( field_weak_reduce( &d->t ) );
  124. field_add ( &d->y, &d->x, &d->z );
  125. field_sub ( &L0, &d->z, &d->x );
  126. field_bias ( &L0, 2 );
  127. IF32( field_weak_reduce( &L0 ) );
  128. field_mul ( &d->z, &L0, &d->y );
  129. field_mul ( &d->x, &d->y, &d->t );
  130. field_mul ( &d->y, &L0, &d->u );
  131. }
  132. void
  133. add_tw_pniels_to_tw_extensible (
  134. struct tw_extensible_t* e,
  135. const struct tw_pniels_t* a
  136. ) {
  137. struct field_t L0;
  138. field_mul ( &L0, &e->z, &a->z );
  139. field_copy ( &e->z, &L0 );
  140. add_tw_niels_to_tw_extensible( e, &a->n );
  141. }
  142. void
  143. sub_tw_pniels_from_tw_extensible (
  144. struct tw_extensible_t* e,
  145. const struct tw_pniels_t* a
  146. ) {
  147. struct field_t L0;
  148. field_mul ( &L0, &e->z, &a->z );
  149. field_copy ( &e->z, &L0 );
  150. sub_tw_niels_from_tw_extensible( e, &a->n );
  151. }
  152. void
  153. double_tw_extensible (
  154. struct tw_extensible_t* a
  155. ) {
  156. struct field_t L0, L1, L2;
  157. field_sqr ( &L2, &a->x );
  158. field_sqr ( &L0, &a->y );
  159. field_add ( &a->u, &L2, &L0 );
  160. field_add ( &a->t, &a->y, &a->x );
  161. field_sqr ( &L1, &a->t );
  162. field_sub ( &a->t, &L1, &a->u );
  163. field_bias ( &a->t, 3 );
  164. IF32( field_weak_reduce( &a->t ) );
  165. field_sub ( &L1, &L0, &L2 );
  166. field_bias ( &L1, 2 );
  167. IF32( field_weak_reduce( &L1 ) );
  168. field_sqr ( &a->x, &a->z );
  169. field_bias ( &a->x, 2-is32 /*is32 ? 1 : 2*/ );
  170. field_add ( &a->z, &a->x, &a->x );
  171. field_sub ( &L0, &a->z, &L1 );
  172. IF32( field_weak_reduce( &L0 ) );
  173. field_mul ( &a->z, &L1, &L0 );
  174. field_mul ( &a->x, &L0, &a->t );
  175. field_mul ( &a->y, &L1, &a->u );
  176. }
  177. void
  178. double_extensible (
  179. struct extensible_t* a
  180. ) {
  181. struct field_t L0, L1, L2;
  182. field_sqr ( &L2, &a->x );
  183. field_sqr ( &L0, &a->y );
  184. field_add ( &L1, &L2, &L0 );
  185. field_add ( &a->t, &a->y, &a->x );
  186. field_sqr ( &a->u, &a->t );
  187. field_sub ( &a->t, &a->u, &L1 );
  188. field_bias ( &a->t, 3 );
  189. IF32( field_weak_reduce( &a->t ) );
  190. field_sub ( &a->u, &L0, &L2 );
  191. field_bias ( &a->u, 2 );
  192. IF32( field_weak_reduce( &a->u ) );
  193. field_sqr ( &a->x, &a->z );
  194. field_bias ( &a->x, 2 );
  195. field_add ( &a->z, &a->x, &a->x );
  196. field_sub ( &L0, &a->z, &L1 );
  197. IF32( field_weak_reduce( &L0 ) );
  198. field_mul ( &a->z, &L1, &L0 );
  199. field_mul ( &a->x, &L0, &a->t );
  200. field_mul ( &a->y, &L1, &a->u );
  201. }
  202. void
  203. twist_and_double (
  204. struct tw_extensible_t* b,
  205. const struct extensible_t* a
  206. ) {
  207. struct field_t L0;
  208. field_sqr ( &b->x, &a->x );
  209. field_sqr ( &b->z, &a->y );
  210. field_add ( &b->u, &b->x, &b->z );
  211. field_add ( &b->t, &a->y, &a->x );
  212. field_sqr ( &L0, &b->t );
  213. field_sub ( &b->t, &L0, &b->u );
  214. field_bias ( &b->t, 3 );
  215. IF32( field_weak_reduce( &b->t ) );
  216. field_sub ( &L0, &b->z, &b->x );
  217. field_bias ( &L0, 2 );
  218. IF32( field_weak_reduce( &L0 ) );
  219. field_sqr ( &b->x, &a->z );
  220. field_bias ( &b->x, 2 );
  221. field_add ( &b->z, &b->x, &b->x );
  222. field_sub ( &b->y, &b->z, &b->u );
  223. IF32( field_weak_reduce( &b->y ) );
  224. field_mul ( &b->z, &L0, &b->y );
  225. field_mul ( &b->x, &b->y, &b->t );
  226. field_mul ( &b->y, &L0, &b->u );
  227. }
  228. void
  229. untwist_and_double (
  230. struct extensible_t* b,
  231. const struct tw_extensible_t* a
  232. ) {
  233. struct field_t L0;
  234. field_sqr ( &b->x, &a->x );
  235. field_sqr ( &b->z, &a->y );
  236. field_add ( &L0, &b->x, &b->z );
  237. field_add ( &b->t, &a->y, &a->x );
  238. field_sqr ( &b->u, &b->t );
  239. field_sub ( &b->t, &b->u, &L0 );
  240. field_bias ( &b->t, 3 );
  241. IF32( field_weak_reduce( &b->t ) );
  242. field_sub ( &b->u, &b->z, &b->x );
  243. field_bias ( &b->u, 2 );
  244. IF32( field_weak_reduce( &b->u ) );
  245. field_sqr ( &b->x, &a->z );
  246. field_bias ( &b->x, 2-is32 /*is32 ? 1 : 2*/ );
  247. field_add ( &b->z, &b->x, &b->x );
  248. field_sub ( &b->y, &b->z, &b->u );
  249. IF32( field_weak_reduce( &b->y ) );
  250. field_mul ( &b->z, &L0, &b->y );
  251. field_mul ( &b->x, &b->y, &b->t );
  252. field_mul ( &b->y, &L0, &b->u );
  253. }
  254. void
  255. convert_tw_affine_to_tw_pniels (
  256. struct tw_pniels_t* b,
  257. const struct tw_affine_t* a
  258. ) {
  259. field_sub ( &b->n.a, &a->y, &a->x );
  260. field_bias ( &b->n.a, 2 );
  261. field_weak_reduce( &b->n.a );
  262. field_add ( &b->n.b, &a->x, &a->y );
  263. field_weak_reduce( &b->n.b );
  264. field_mul ( &b->z, &a->y, &a->x );
  265. field_mulw_scc_wr ( &b->n.c, &b->z, 2*EDWARDS_D-2 );
  266. field_set_ui( &b->z, 2 );
  267. }
  268. void
  269. convert_tw_affine_to_tw_extensible (
  270. struct tw_extensible_t* b,
  271. const struct tw_affine_t* a
  272. ) {
  273. field_copy ( &b->x, &a->x );
  274. field_copy ( &b->y, &a->y );
  275. field_set_ui( &b->z, 1 );
  276. field_copy ( &b->t, &a->x );
  277. field_copy ( &b->u, &a->y );
  278. }
  279. void
  280. convert_affine_to_extensible (
  281. struct extensible_t* b,
  282. const struct affine_t* a
  283. ) {
  284. field_copy ( &b->x, &a->x );
  285. field_copy ( &b->y, &a->y );
  286. field_set_ui( &b->z, 1 );
  287. field_copy ( &b->t, &a->x );
  288. field_copy ( &b->u, &a->y );
  289. }
  290. void
  291. convert_tw_extensible_to_tw_pniels (
  292. struct tw_pniels_t* b,
  293. const struct tw_extensible_t* a
  294. ) {
  295. field_sub ( &b->n.a, &a->y, &a->x );
  296. field_bias ( &b->n.a, 2 );
  297. field_weak_reduce( &b->n.a );
  298. field_add ( &b->n.b, &a->x, &a->y );
  299. field_weak_reduce( &b->n.b );
  300. field_mul ( &b->z, &a->u, &a->t );
  301. field_mulw_scc_wr ( &b->n.c, &b->z, 2*EDWARDS_D-2 );
  302. field_add ( &b->z, &a->z, &a->z );
  303. field_weak_reduce( &b->z );
  304. }
  305. void
  306. convert_tw_pniels_to_tw_extensible (
  307. struct tw_extensible_t* e,
  308. const struct tw_pniels_t* d
  309. ) {
  310. field_add ( &e->u, &d->n.b, &d->n.a );
  311. field_sub ( &e->t, &d->n.b, &d->n.a );
  312. field_bias ( &e->t, 2 );
  313. IF32( field_weak_reduce( &e->t ) );
  314. field_mul ( &e->x, &d->z, &e->t );
  315. field_mul ( &e->y, &d->z, &e->u );
  316. field_sqr ( &e->z, &d->z );
  317. }
  318. void
  319. convert_tw_niels_to_tw_extensible (
  320. struct tw_extensible_t* e,
  321. const struct tw_niels_t* d
  322. ) {
  323. field_add ( &e->y, &d->b, &d->a );
  324. field_weak_reduce( &e->y );
  325. field_sub ( &e->x, &d->b, &d->a );
  326. field_bias ( &e->x, 2 );
  327. field_weak_reduce( &e->x );
  328. field_set_ui( &e->z, 1 );
  329. field_copy ( &e->t, &e->x );
  330. field_copy ( &e->u, &e->y );
  331. }
  332. void
  333. montgomery_step (
  334. struct montgomery_t* a
  335. ) {
  336. struct field_t L0, L1;
  337. field_add ( &L0, &a->zd, &a->xd );
  338. field_sub ( &L1, &a->xd, &a->zd );
  339. field_bias ( &L1, 2 );
  340. IF32( field_weak_reduce( &L1 ) );
  341. field_sub ( &a->zd, &a->xa, &a->za );
  342. field_bias ( &a->zd, 2 );
  343. IF32( field_weak_reduce( &a->zd ) );
  344. field_mul ( &a->xd, &L0, &a->zd );
  345. field_add ( &a->zd, &a->za, &a->xa );
  346. field_mul ( &a->za, &L1, &a->zd );
  347. field_add ( &a->xa, &a->za, &a->xd );
  348. field_sqr ( &a->zd, &a->xa );
  349. field_mul ( &a->xa, &a->z0, &a->zd );
  350. field_sub ( &a->zd, &a->xd, &a->za );
  351. field_bias ( &a->zd, 2 );
  352. IF32( field_weak_reduce( &a->zd ) );
  353. field_sqr ( &a->za, &a->zd );
  354. field_sqr ( &a->xd, &L0 );
  355. field_sqr ( &L0, &L1 );
  356. field_mulw ( &a->zd, &a->xd, 1-EDWARDS_D );
  357. field_sub ( &L1, &a->xd, &L0 );
  358. field_bias ( &L1, 2 );
  359. IF32( field_weak_reduce( &L1 ) );
  360. field_mul ( &a->xd, &L0, &a->zd );
  361. field_sub ( &L0, &a->zd, &L1 );
  362. field_bias ( &L0, 4 - 2*is32 /*is32 ? 2 : 4*/ );
  363. IF32( field_weak_reduce( &L0 ) );
  364. field_mul ( &a->zd, &L0, &L1 );
  365. }
  366. void
  367. deserialize_montgomery (
  368. struct montgomery_t* a,
  369. const struct field_t* sbz
  370. ) {
  371. field_sqr ( &a->z0, sbz );
  372. field_set_ui( &a->xd, 1 );
  373. field_set_ui( &a->zd, 0 );
  374. field_set_ui( &a->xa, 1 );
  375. field_copy ( &a->za, &a->z0 );
  376. }
  377. mask_t
  378. serialize_montgomery (
  379. struct field_t* b,
  380. const struct montgomery_t* a,
  381. const struct field_t* sbz
  382. ) {
  383. mask_t L4, L5, L6;
  384. struct field_t L0, L1, L2, L3;
  385. field_mul ( &L3, &a->z0, &a->zd );
  386. field_sub ( &L1, &L3, &a->xd );
  387. field_bias ( &L1, 2 );
  388. IF32( field_weak_reduce( &L1 ) );
  389. field_mul ( &L3, &a->za, &L1 );
  390. field_mul ( &L2, &a->z0, &a->xd );
  391. field_sub ( &L1, &L2, &a->zd );
  392. field_bias ( &L1, 2 );
  393. IF32( field_weak_reduce( &L1 ) );
  394. field_mul ( &L0, &a->xa, &L1 );
  395. field_add ( &L2, &L0, &L3 );
  396. field_sub ( &L1, &L3, &L0 );
  397. field_bias ( &L1, 2 );
  398. IF32( field_weak_reduce( &L1 ) );
  399. field_mul ( &L3, &L1, &L2 );
  400. field_copy ( &L2, &a->z0 );
  401. field_addw ( &L2, 1 );
  402. field_sqr ( &L1, &L2 );
  403. field_mulw ( &L2, &L1, 1-EDWARDS_D );
  404. field_neg ( &L1, &L2 );
  405. field_add ( &L2, &a->z0, &a->z0 );
  406. field_bias ( &L2, 1 );
  407. field_add ( &L0, &L2, &L2 );
  408. field_add ( &L2, &L0, &L1 );
  409. IF32( field_weak_reduce( &L2 ) );
  410. field_mul ( &L0, &a->xd, &L2 );
  411. L5 = field_is_zero( &a->zd );
  412. L6 = - L5;
  413. field_mask ( &L1, &L0, L5 );
  414. field_add ( &L2, &L1, &a->zd );
  415. L4 = ~ L5;
  416. field_mul ( &L1, sbz, &L3 );
  417. field_addw ( &L1, L6 );
  418. field_mul ( &L3, &L2, &L1 );
  419. field_mul ( &L1, &L3, &L2 );
  420. field_mul ( &L2, &L3, &a->xd );
  421. field_mul ( &L3, &L1, &L2 );
  422. field_isr ( &L0, &L3 );
  423. field_mul ( &L2, &L1, &L0 );
  424. field_sqr ( &L1, &L0 );
  425. field_mul ( &L0, &L3, &L1 );
  426. field_mask ( b, &L2, L4 );
  427. field_subw ( &L0, 1 );
  428. field_bias ( &L0, 1 );
  429. L5 = field_is_zero( &L0 );
  430. L4 = field_is_zero( sbz );
  431. return L5 | L4;
  432. }
  433. void
  434. serialize_extensible (
  435. struct field_t* b,
  436. const struct extensible_t* a
  437. ) {
  438. struct field_t L0, L1, L2;
  439. field_sub ( &L0, &a->y, &a->z );
  440. field_bias ( &L0, 2 );
  441. IF32( field_weak_reduce( &L0 ) );
  442. field_add ( b, &a->z, &a->y );
  443. field_mul ( &L1, &a->z, &a->x );
  444. field_mul ( &L2, &L0, &L1 );
  445. field_mul ( &L1, &L2, &L0 );
  446. field_mul ( &L0, &L2, b );
  447. field_mul ( &L2, &L1, &L0 );
  448. field_isr ( &L0, &L2 );
  449. field_mul ( b, &L1, &L0 );
  450. field_sqr ( &L1, &L0 );
  451. field_mul ( &L0, &L2, &L1 );
  452. }
  453. void
  454. untwist_and_double_and_serialize (
  455. struct field_t* b,
  456. const struct tw_extensible_t* a
  457. ) {
  458. struct field_t L0, L1, L2, L3;
  459. field_mul ( &L3, &a->y, &a->x );
  460. field_add ( b, &a->y, &a->x );
  461. field_sqr ( &L1, b );
  462. field_add ( &L2, &L3, &L3 );
  463. field_sub ( b, &L1, &L2 );
  464. field_bias ( b, 3 );
  465. IF32( field_weak_reduce( b ) );
  466. field_sqr ( &L2, &a->z );
  467. field_sqr ( &L1, &L2 );
  468. field_add ( &L2, b, b );
  469. field_mulw ( b, &L2, 1-EDWARDS_D );
  470. field_neg ( &L2, b );
  471. field_bias ( &L2, 2 );
  472. field_mulw ( &L0, &L2, 1-EDWARDS_D );
  473. field_neg ( b, &L0 );
  474. field_bias ( b, 2 );
  475. field_mul ( &L0, &L2, &L1 );
  476. field_mul ( &L2, b, &L0 );
  477. field_isr ( &L0, &L2 );
  478. field_mul ( &L1, b, &L0 );
  479. field_sqr ( b, &L0 );
  480. field_mul ( &L0, &L2, b );
  481. field_mul ( b, &L1, &L3 );
  482. }
  483. void
  484. twist_even (
  485. struct tw_extensible_t* b,
  486. const struct extensible_t* a
  487. ) {
  488. mask_t L0, L1;
  489. field_sqr ( &b->y, &a->z );
  490. field_sqr ( &b->z, &a->x );
  491. field_sub ( &b->u, &b->y, &b->z );
  492. field_bias ( &b->u, 2 );
  493. IF32( field_weak_reduce( &b->u ) );
  494. field_sub ( &b->z, &a->z, &a->x );
  495. field_bias ( &b->z, 2 );
  496. IF32( field_weak_reduce( &b->z ) );
  497. field_mul ( &b->y, &b->z, &a->y );
  498. field_sub ( &b->z, &a->z, &a->y );
  499. field_bias ( &b->z, 2 );
  500. IF32( field_weak_reduce( &b->z ) );
  501. field_mul ( &b->x, &b->z, &b->y );
  502. field_mul ( &b->t, &b->x, &b->u );
  503. field_mul ( &b->y, &b->x, &b->t );
  504. field_isr ( &b->t, &b->y );
  505. field_mul ( &b->u, &b->x, &b->t );
  506. field_sqr ( &b->x, &b->t );
  507. field_mul ( &b->t, &b->y, &b->x );
  508. field_mul ( &b->x, &a->x, &b->u );
  509. field_mul ( &b->y, &a->y, &b->u );
  510. L1 = field_is_zero( &b->z );
  511. L0 = - L1;
  512. field_addw ( &b->y, L0 );
  513. field_weak_reduce( &b->y );
  514. field_set_ui( &b->z, 1 );
  515. field_copy ( &b->t, &b->x );
  516. field_copy ( &b->u, &b->y );
  517. }
  518. void
  519. test_only_twist (
  520. struct tw_extensible_t* b,
  521. const struct extensible_t* a
  522. ) {
  523. mask_t L2, L3;
  524. struct field_t L0, L1;
  525. field_sqr ( &b->u, &a->z );
  526. field_sqr ( &b->y, &a->x );
  527. field_sub ( &b->z, &b->u, &b->y );
  528. field_bias ( &b->z, 2 );
  529. field_add ( &b->y, &b->z, &b->z );
  530. field_add ( &b->u, &b->y, &b->y );
  531. IF32( field_weak_reduce( &b->u ) );
  532. field_sub ( &b->y, &a->z, &a->x );
  533. field_bias ( &b->y, 2 );
  534. IF32( field_weak_reduce( &b->y ) );
  535. field_mul ( &b->x, &b->y, &a->y );
  536. field_sub ( &b->z, &a->z, &a->y );
  537. field_bias ( &b->z, 2 );
  538. IF32( field_weak_reduce( &b->z ) );
  539. field_mul ( &b->t, &b->z, &b->x );
  540. field_mul ( &L1, &b->t, &b->u );
  541. field_mul ( &b->x, &b->t, &L1 );
  542. field_isr ( &L0, &b->x );
  543. field_mul ( &b->u, &b->t, &L0 );
  544. field_sqr ( &L1, &L0 );
  545. field_mul ( &b->t, &b->x, &L1 );
  546. field_add ( &L1, &a->y, &a->x );
  547. IF32( field_weak_reduce( &L1 ) );
  548. field_sub ( &L0, &a->x, &a->y );
  549. field_bias ( &L0, 2 );
  550. IF32( field_weak_reduce( &L0 ) );
  551. field_mul ( &b->x, &b->t, &L0 );
  552. field_add ( &L0, &b->x, &L1 );
  553. field_sub ( &b->t, &L1, &b->x );
  554. field_bias ( &b->t, 2 );
  555. IF32( field_weak_reduce( &b->t ) );
  556. field_mul ( &b->x, &L0, &b->u );
  557. L2 = field_is_zero( &b->y );
  558. L3 = - L2;
  559. field_addw ( &b->x, L3 );
  560. field_weak_reduce( &b->x );
  561. field_mul ( &b->y, &b->t, &b->u );
  562. L2 = field_is_zero( &b->z );
  563. L3 = - L2;
  564. field_addw ( &b->y, L3 );
  565. field_weak_reduce( &b->y );
  566. L3 = field_is_zero( &a->y );
  567. L2 = L3 + 1;
  568. field_set_ui( &b->z, L2 );
  569. field_copy ( &b->t, &b->x );
  570. field_copy ( &b->u, &b->y );
  571. }
  572. mask_t
  573. is_even_pt (
  574. const struct extensible_t* a
  575. ) {
  576. struct field_t L0, L1, L2;
  577. field_sqr ( &L2, &a->z );
  578. field_sqr ( &L1, &a->x );
  579. field_sub ( &L0, &L2, &L1 );
  580. field_bias ( &L0, 2 );
  581. field_weak_reduce( &L0 );
  582. return field_is_square ( &L0 );
  583. }
  584. mask_t
  585. is_even_tw (
  586. const struct tw_extensible_t* a
  587. ) {
  588. struct field_t L0, L1, L2;
  589. field_sqr ( &L2, &a->z );
  590. field_sqr ( &L1, &a->x );
  591. field_add ( &L0, &L1, &L2 );
  592. field_weak_reduce( &L0 );
  593. return field_is_square ( &L0 );
  594. }
  595. mask_t
  596. deserialize_affine (
  597. struct affine_t* a,
  598. const struct field_t* sz
  599. ) {
  600. struct field_t L0, L1, L2, L3;
  601. field_sqr ( &L1, sz );
  602. field_copy ( &L3, &L1 );
  603. field_addw ( &L3, 1 );
  604. field_sqr ( &L2, &L3 );
  605. field_mulw ( &L3, &L2, 1-EDWARDS_D );
  606. field_neg ( &a->x, &L3 );
  607. field_add ( &L3, &L1, &L1 );
  608. field_bias ( &L3, 1 );
  609. field_add ( &a->y, &L3, &L3 );
  610. field_add ( &L3, &a->y, &a->x );
  611. IF32( field_weak_reduce( &L3 ) );
  612. field_copy ( &a->y, &L1 );
  613. field_subw ( &a->y, 1 );
  614. field_neg ( &a->x, &a->y );
  615. field_bias ( &a->x, 2 );
  616. IF32( field_weak_reduce( &a->x ) );
  617. field_mul ( &a->y, &a->x, &L3 );
  618. field_sqr ( &L2, &a->x );
  619. field_mul ( &L0, &L2, &a->y );
  620. field_mul ( &a->y, &a->x, &L0 );
  621. field_isr ( &L3, &a->y );
  622. field_mul ( &a->y, &L2, &L3 );
  623. field_sqr ( &L2, &L3 );
  624. field_mul ( &L3, &L0, &L2 );
  625. field_mul ( &L0, &a->x, &L3 );
  626. field_add ( &L2, &a->y, &a->y );
  627. field_mul ( &a->x, sz, &L2 );
  628. field_addw ( &L1, 1 );
  629. field_mul ( &a->y, &L1, &L3 );
  630. field_subw ( &L0, 1 );
  631. field_bias ( &L0, 1 );
  632. return field_is_zero( &L0 );
  633. }
  634. mask_t
  635. deserialize_and_twist_approx (
  636. struct tw_extensible_t* a,
  637. const struct field_t* sdm1,
  638. const struct field_t* sz
  639. ) {
  640. struct field_t L0, L1;
  641. field_sqr ( &a->z, sz );
  642. field_copy ( &a->y, &a->z );
  643. field_addw ( &a->y, 1 );
  644. field_sqr ( &a->x, &a->y );
  645. field_mulw ( &a->y, &a->x, 1-EDWARDS_D );
  646. field_neg ( &a->x, &a->y );
  647. field_add ( &a->y, &a->z, &a->z );
  648. field_bias ( &a->y, 1 );
  649. field_add ( &a->u, &a->y, &a->y );
  650. field_add ( &a->y, &a->u, &a->x );
  651. IF32( field_weak_reduce( &a->y ) );
  652. field_sqr ( &a->x, &a->z );
  653. field_subw ( &a->x, 1 );
  654. field_neg ( &a->u, &a->x );
  655. field_bias ( &a->u, 2 );
  656. IF32( field_weak_reduce( &a->u ) );
  657. field_mul ( &a->x, sdm1, &a->u );
  658. field_mul ( &L0, &a->x, &a->y );
  659. field_mul ( &a->t, &L0, &a->y );
  660. field_mul ( &a->u, &a->x, &a->t );
  661. field_mul ( &a->t, &a->u, &L0 );
  662. field_mul ( &a->y, &a->x, &a->t );
  663. field_isr ( &L0, &a->y );
  664. field_mul ( &a->y, &a->u, &L0 );
  665. field_sqr ( &L1, &L0 );
  666. field_mul ( &a->u, &a->t, &L1 );
  667. field_mul ( &a->t, &a->x, &a->u );
  668. field_add ( &a->x, sz, sz );
  669. field_mul ( &L0, &a->u, &a->x );
  670. field_copy ( &a->x, &a->z );
  671. field_subw ( &a->x, 1 );
  672. field_neg ( &L1, &a->x );
  673. field_bias ( &L1, 2 );
  674. IF32( field_weak_reduce( &L1 ) );
  675. field_mul ( &a->x, &L1, &L0 );
  676. field_mul ( &L0, &a->u, &a->y );
  677. field_addw ( &a->z, 1 );
  678. field_mul ( &a->y, &a->z, &L0 );
  679. field_subw ( &a->t, 1 );
  680. field_bias ( &a->t, 1 );
  681. mask_t ret = field_is_zero( &a->t );
  682. field_set_ui( &a->z, 1 );
  683. field_copy ( &a->t, &a->x );
  684. field_copy ( &a->u, &a->y );
  685. return ret;
  686. }
  687. void
  688. set_identity_extensible (
  689. struct extensible_t* a
  690. ) {
  691. field_set_ui( &a->x, 0 );
  692. field_set_ui( &a->y, 1 );
  693. field_set_ui( &a->z, 1 );
  694. field_set_ui( &a->t, 0 );
  695. field_set_ui( &a->u, 0 );
  696. }
  697. void
  698. set_identity_tw_extensible (
  699. struct tw_extensible_t* a
  700. ) {
  701. field_set_ui( &a->x, 0 );
  702. field_set_ui( &a->y, 1 );
  703. field_set_ui( &a->z, 1 );
  704. field_set_ui( &a->t, 0 );
  705. field_set_ui( &a->u, 0 );
  706. }
  707. void
  708. set_identity_affine (
  709. struct affine_t* a
  710. ) {
  711. field_set_ui( &a->x, 0 );
  712. field_set_ui( &a->y, 1 );
  713. }
  714. mask_t
  715. eq_affine (
  716. const struct affine_t* a,
  717. const struct affine_t* b
  718. ) {
  719. mask_t L1, L2;
  720. struct field_t L0;
  721. field_sub ( &L0, &a->x, &b->x );
  722. field_bias ( &L0, 2 );
  723. L2 = field_is_zero( &L0 );
  724. field_sub ( &L0, &a->y, &b->y );
  725. field_bias ( &L0, 2 );
  726. L1 = field_is_zero( &L0 );
  727. return L2 & L1;
  728. }
  729. mask_t
  730. eq_extensible (
  731. const struct extensible_t* a,
  732. const struct extensible_t* b
  733. ) {
  734. mask_t L3, L4;
  735. struct field_t L0, L1, L2;
  736. field_mul ( &L2, &b->z, &a->x );
  737. field_mul ( &L1, &a->z, &b->x );
  738. field_sub ( &L0, &L2, &L1 );
  739. field_bias ( &L0, 2 );
  740. L4 = field_is_zero( &L0 );
  741. field_mul ( &L2, &b->z, &a->y );
  742. field_mul ( &L1, &a->z, &b->y );
  743. field_sub ( &L0, &L2, &L1 );
  744. field_bias ( &L0, 2 );
  745. L3 = field_is_zero( &L0 );
  746. return L4 & L3;
  747. }
  748. mask_t
  749. eq_tw_extensible (
  750. const struct tw_extensible_t* a,
  751. const struct tw_extensible_t* b
  752. ) {
  753. mask_t L3, L4;
  754. struct field_t L0, L1, L2;
  755. field_mul ( &L2, &b->z, &a->x );
  756. field_mul ( &L1, &a->z, &b->x );
  757. field_sub ( &L0, &L2, &L1 );
  758. field_bias ( &L0, 2 );
  759. L4 = field_is_zero( &L0 );
  760. field_mul ( &L2, &b->z, &a->y );
  761. field_mul ( &L1, &a->z, &b->y );
  762. field_sub ( &L0, &L2, &L1 );
  763. field_bias ( &L0, 2 );
  764. L3 = field_is_zero( &L0 );
  765. return L4 & L3;
  766. }
  767. void
  768. elligator_2s_inject (
  769. struct affine_t* a,
  770. const struct field_t* r
  771. ) {
  772. mask_t L0, L1;
  773. struct field_t L2, L3, L4, L5, L6, L7, L8;
  774. field_sqr ( &a->x, r );
  775. field_sqr ( &L3, &a->x );
  776. field_copy ( &a->y, &L3 );
  777. field_subw ( &a->y, 1 );
  778. field_neg ( &L4, &a->y );
  779. field_bias ( &L4, 2 );
  780. IF32( field_weak_reduce( &L4 ) );
  781. field_sqr ( &L2, &L4 );
  782. field_mulw ( &L7, &L2, (EDWARDS_D-1)*(EDWARDS_D-1) );
  783. field_mulw ( &L8, &L3, 4*(EDWARDS_D+1)*(EDWARDS_D+1) );
  784. field_add ( &a->y, &L8, &L7 );
  785. IF32( field_weak_reduce( &a->y ) );
  786. field_mulw ( &L8, &L2, 4*(EDWARDS_D)*(EDWARDS_D-1) );
  787. field_sub ( &L7, &a->y, &L8 );
  788. field_bias ( &L7, 2 );
  789. IF32( field_weak_reduce( &L7 ) );
  790. field_mulw_scc ( &L6, &a->y, -2-2*EDWARDS_D );
  791. field_mul ( &L5, &L7, &L6 );
  792. field_mul ( &L8, &L5, &L4 );
  793. field_mul ( &L4, &L5, &L6 );
  794. field_mul ( &L5, &L7, &L8 );
  795. field_mul ( &L8, &L5, &L4 );
  796. field_mul ( &L4, &L7, &L8 );
  797. field_isr ( &L6, &L4 );
  798. field_mul ( &L4, &L5, &L6 );
  799. field_sqr ( &L5, &L6 );
  800. field_mul ( &L6, &L8, &L5 );
  801. field_mul ( &L8, &L7, &L6 );
  802. field_mul ( &L7, &L8, &L6 );
  803. field_copy ( &L6, &a->x );
  804. field_subw ( &L6, 1 );
  805. field_addw ( &a->x, 1 );
  806. field_mul ( &L5, &a->x, &L8 );
  807. field_sub ( &a->x, &L6, &L5 );
  808. field_bias ( &a->x, 3 );
  809. IF32( field_weak_reduce( &a->x ) );
  810. field_mul ( &L5, &L4, &a->x );
  811. field_mulw_scc_wr ( &a->x, &L5, -2-2*EDWARDS_D );
  812. field_add ( &L4, &L3, &L3 );
  813. field_add ( &L3, &L4, &L2 );
  814. field_subw ( &L3, 2 );
  815. field_bias ( &L3, 1 );
  816. IF32( field_weak_reduce( &L3 ) );
  817. field_mul ( &L2, &L3, &L8 );
  818. field_mulw ( &L3, &L2, 2*(EDWARDS_D+1)*(EDWARDS_D-1) );
  819. field_add ( &L2, &L3, &a->y );
  820. field_mul ( &a->y, &L7, &L2 );
  821. L1 = field_is_zero( &L8 );
  822. L0 = - L1;
  823. field_addw ( &a->y, L0 );
  824. field_weak_reduce( &a->y );
  825. }
  826. mask_t
  827. validate_affine (
  828. const struct affine_t* a
  829. ) {
  830. struct field_t L0, L1, L2, L3;
  831. field_sqr ( &L0, &a->y );
  832. field_sqr ( &L1, &a->x );
  833. field_add ( &L3, &L1, &L0 );
  834. field_subw ( &L3, 1 );
  835. field_mulw_scc ( &L2, &L1, EDWARDS_D );
  836. field_mul ( &L1, &L0, &L2 );
  837. field_sub ( &L0, &L3, &L1 );
  838. field_bias ( &L0, 3 );
  839. return field_is_zero( &L0 );
  840. }
  841. mask_t
  842. validate_tw_extensible (
  843. const struct tw_extensible_t* ext
  844. ) {
  845. mask_t L4, L5;
  846. struct field_t L0, L1, L2, L3;
  847. /*
  848. * Check invariant:
  849. * 0 = -x*y + z*t*u
  850. */
  851. field_mul ( &L1, &ext->t, &ext->u );
  852. field_mul ( &L2, &ext->z, &L1 );
  853. field_mul ( &L0, &ext->x, &ext->y );
  854. field_neg ( &L1, &L0 );
  855. field_add ( &L0, &L1, &L2 );
  856. field_bias ( &L0, 2 );
  857. L5 = field_is_zero( &L0 );
  858. /*
  859. * Check invariant:
  860. * 0 = d*t^2*u^2 + x^2 - y^2 + z^2 - t^2*u^2
  861. */
  862. field_sqr ( &L2, &ext->y );
  863. field_neg ( &L1, &L2 );
  864. field_sqr ( &L0, &ext->x );
  865. field_add ( &L2, &L0, &L1 );
  866. field_sqr ( &L3, &ext->u );
  867. field_sqr ( &L0, &ext->t );
  868. field_mul ( &L1, &L0, &L3 );
  869. field_mulw_scc ( &L3, &L1, EDWARDS_D );
  870. field_add ( &L0, &L3, &L2 );
  871. field_neg ( &L3, &L1 );
  872. field_add ( &L2, &L3, &L0 );
  873. field_sqr ( &L1, &ext->z );
  874. field_add ( &L0, &L1, &L2 );
  875. field_bias ( &L0, 2 );
  876. L4 = field_is_zero( &L0 );
  877. return L5 & L4 &~ field_is_zero(&ext->z);
  878. }
  879. mask_t
  880. validate_extensible (
  881. const struct extensible_t* ext
  882. ) {
  883. mask_t L4, L5;
  884. struct field_t L0, L1, L2, L3;
  885. /*
  886. * Check invariant:
  887. * 0 = d*t^2*u^2 - x^2 - y^2 + z^2
  888. */
  889. field_sqr ( &L2, &ext->y );
  890. field_neg ( &L1, &L2 );
  891. field_sqr ( &L0, &ext->z );
  892. field_add ( &L2, &L0, &L1 );
  893. field_sqr ( &L3, &ext->u );
  894. field_sqr ( &L0, &ext->t );
  895. field_mul ( &L1, &L0, &L3 );
  896. field_mulw_scc ( &L0, &L1, EDWARDS_D );
  897. field_add ( &L1, &L0, &L2 );
  898. field_sqr ( &L0, &ext->x );
  899. field_neg ( &L2, &L0 );
  900. field_add ( &L0, &L2, &L1 );
  901. field_bias ( &L0, 2 );
  902. L5 = field_is_zero( &L0 );
  903. /*
  904. * Check invariant:
  905. * 0 = -x*y + z*t*u
  906. */
  907. field_mul ( &L1, &ext->t, &ext->u );
  908. field_mul ( &L2, &ext->z, &L1 );
  909. field_mul ( &L0, &ext->x, &ext->y );
  910. field_neg ( &L1, &L0 );
  911. field_add ( &L0, &L1, &L2 );
  912. field_bias ( &L0, 2 );
  913. L4 = field_is_zero( &L0 );
  914. return L5 & L4 &~ field_is_zero(&ext->z);
  915. }