Browse Source

ntru: faster multiplication for reference implementations

tags/v0.0.1
John M. Schanck 4 years ago
committed by Kris Kwiatkowski
parent
commit
7d44f5f587
29 changed files with 1206 additions and 896 deletions
  1. +2
    -2
      crypto_kem/ntruhps2048509/META.yml
  2. +1
    -4
      crypto_kem/ntruhps2048509/avx2/owcpa.h
  3. +8
    -0
      crypto_kem/ntruhps2048509/avx2/poly.c
  4. +0
    -105
      crypto_kem/ntruhps2048509/avx2/poly_rq_mul.s
  5. +1
    -4
      crypto_kem/ntruhps2048509/clean/owcpa.h
  6. +8
    -0
      crypto_kem/ntruhps2048509/clean/poly.c
  7. +277
    -8
      crypto_kem/ntruhps2048509/clean/poly_rq_mul.c
  8. +2
    -2
      crypto_kem/ntruhps2048677/META.yml
  9. +1
    -4
      crypto_kem/ntruhps2048677/avx2/owcpa.h
  10. +8
    -0
      crypto_kem/ntruhps2048677/avx2/poly.c
  11. +0
    -185
      crypto_kem/ntruhps2048677/avx2/poly_rq_mul.s
  12. +1
    -4
      crypto_kem/ntruhps2048677/clean/owcpa.h
  13. +8
    -0
      crypto_kem/ntruhps2048677/clean/poly.c
  14. +277
    -8
      crypto_kem/ntruhps2048677/clean/poly_rq_mul.c
  15. +2
    -2
      crypto_kem/ntruhps4096821/META.yml
  16. +1
    -4
      crypto_kem/ntruhps4096821/avx2/owcpa.h
  17. +8
    -0
      crypto_kem/ntruhps4096821/avx2/poly.c
  18. +0
    -241
      crypto_kem/ntruhps4096821/avx2/poly_rq_mul.s
  19. +1
    -4
      crypto_kem/ntruhps4096821/clean/owcpa.h
  20. +8
    -0
      crypto_kem/ntruhps4096821/clean/poly.c
  21. +277
    -8
      crypto_kem/ntruhps4096821/clean/poly_rq_mul.c
  22. +2
    -2
      crypto_kem/ntruhrss701/META.yml
  23. +1
    -4
      crypto_kem/ntruhrss701/avx2/owcpa.h
  24. +8
    -0
      crypto_kem/ntruhrss701/avx2/poly.c
  25. +18
    -156
      crypto_kem/ntruhrss701/avx2/poly_lift.s
  26. +0
    -137
      crypto_kem/ntruhrss701/avx2/poly_rq_mul.s
  27. +1
    -4
      crypto_kem/ntruhrss701/clean/owcpa.h
  28. +8
    -0
      crypto_kem/ntruhrss701/clean/poly.c
  29. +277
    -8
      crypto_kem/ntruhrss701/clean/poly_rq_mul.c

+ 2
- 2
crypto_kem/ntruhps2048509/META.yml View File

@@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang
implementations:
- name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms:
- architecture: x86_64
operating_systems:


+ 1
- 4
crypto_kem/ntruhps2048509/avx2/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps2048509/avx2/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048509_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS2048509_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS2048509_AVX2_poly_mod_3_Phi_n(r);
}



+ 0
- 105
crypto_kem/ntruhps2048509/avx2/poly_rq_mul.s View File

@@ -253,23 +253,6 @@ mask_keephigh:
.word 65535
.word 65535
.word 65535
mask_mod2048:
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.text
.global PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul
.global _PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul
@@ -3597,13 +3580,9 @@ vpand mask_keephigh(%rip), %ymm9, %ymm10
vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm9, 2560(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 0(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 256(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 512(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 768(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8
@@ -3693,13 +3672,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8
vpor %ymm8, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm7, 2592(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 64(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 320(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 576(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 832(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4
@@ -3789,13 +3764,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4
vpor %ymm4, %ymm5, %ymm5
vpaddw %ymm5, %ymm8, %ymm8
vmovdqa %xmm3, 2624(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 128(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 384(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 640(%rdi)
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 896(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9
@@ -3885,13 +3856,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9
vpor %ymm9, %ymm11, %ymm11
vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm10, 2656(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 192(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 448(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 704(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 960(%rdi)
vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7
@@ -3971,7 +3938,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm10, %ymm10
vmovdqa 0(%rdi), %ymm7
vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 0(%rdi)
vmovdqa %xmm2, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm4, %ymm4
@@ -3998,11 +3964,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm5, %ymm5
vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm2, 2688(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 512(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 768(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -4082,7 +4045,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm2, %ymm2
vmovdqa 64(%rdi), %ymm3
vpaddw %ymm2, %ymm3, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 64(%rdi)
vmovdqa %xmm8, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9
@@ -4109,11 +4071,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm11, %ymm11
vpaddw %ymm11, %ymm7, %ymm7
vmovdqa %xmm8, 2720(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 320(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 576(%rdi)
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 832(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10
@@ -4193,7 +4152,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm8, %ymm8
vmovdqa 128(%rdi), %ymm10
vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 128(%rdi)
vmovdqa %xmm4, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm7, %ymm7
@@ -4220,11 +4178,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm4, 2752(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 640(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 896(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2
@@ -4304,7 +4259,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm4, %ymm4
vmovdqa 192(%rdi), %ymm2
vpaddw %ymm4, %ymm2, %ymm2
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 192(%rdi)
vmovdqa %xmm9, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3
@@ -4331,11 +4285,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm9, 2784(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 448(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 704(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 960(%rdi)
vmovdqa 96(%r12), %ymm0
vpsubw 160(%r12), %ymm0, %ymm0
@@ -4729,13 +4680,9 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm3, 2560(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 32(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 288(%rdi)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 544(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 800(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm4
@@ -4828,13 +4775,9 @@ vpor %ymm4, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm10, 2592(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 96(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 352(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 608(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 864(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm9
@@ -4927,13 +4870,9 @@ vpor %ymm9, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm4, %ymm4
vpaddw %ymm5, %ymm4, %ymm4
vmovdqa %xmm2, 2624(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 160(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 416(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 672(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 928(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -5026,22 +4965,18 @@ vpor %ymm3, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm9, %ymm9
vpaddw %ymm11, %ymm9, %ymm9
vmovdqa %xmm8, 2656(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 224(%rdi)
vextracti128 $1, %ymm5, %xmm5
vpshufb shufmin5_mask3(%rip), %ymm5, %ymm5
vmovdqa %xmm5, 1792(%rsp)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 480(%rdi)
vextracti128 $1, %ymm6, %xmm6
vpshufb shufmin5_mask3(%rip), %ymm6, %ymm6
vmovdqa %xmm6, 1824(%rsp)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 736(%rdi)
vextracti128 $1, %ymm9, %xmm9
vpshufb shufmin5_mask3(%rip), %ymm9, %ymm9
vmovdqa %xmm9, 1856(%rsp)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 992(%rdi)
vextracti128 $1, %ymm2, %xmm2
vpshufb shufmin5_mask3(%rip), %ymm2, %ymm2
@@ -5125,7 +5060,6 @@ vpor %ymm10, %ymm8, %ymm8
vmovdqa 32(%rdi), %ymm10
vpaddw 1920(%rsp), %ymm10, %ymm10
vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 32(%rdi)
vmovdqa %xmm7, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9
@@ -5155,11 +5089,8 @@ vpor %ymm10, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm3, %ymm3
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm7, 2688(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 288(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 544(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 800(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2
@@ -5240,7 +5171,6 @@ vpor %ymm2, %ymm7, %ymm7
vmovdqa 96(%rdi), %ymm2
vpaddw 1952(%rsp), %ymm2, %ymm2
vpaddw %ymm7, %ymm2, %ymm2
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 96(%rdi)
vmovdqa %xmm4, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3
@@ -5270,11 +5200,8 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm10, %ymm10
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm4, 2720(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 352(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 608(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 864(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm8
@@ -5355,7 +5282,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqa 160(%rdi), %ymm8
vpaddw 1984(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 160(%rdi)
vmovdqa %xmm9, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm10, %ymm10
@@ -5385,11 +5311,8 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm9, 2752(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 416(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 672(%rdi)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 928(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm7
@@ -5479,7 +5402,6 @@ vpor %ymm7, %ymm9, %ymm9
vmovdqa 224(%rdi), %ymm7
vpaddw 2016(%rsp), %ymm7, %ymm7
vpaddw %ymm9, %ymm7, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 224(%rdi)
vextracti128 $1, %ymm7, %xmm7
vpshufb shufmin5_mask3(%rip), %ymm7, %ymm7
@@ -5512,113 +5434,86 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm3, 2784(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 480(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 736(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 992(%rdi)
vmovdqa 0(%rdi), %ymm11
vpaddw 1888(%rsp), %ymm11, %ymm11
vpaddw 2816(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 0(%rdi)
vmovdqa 256(%rdi), %ymm11
vpaddw 2528(%rsp), %ymm11, %ymm11
vpaddw 2848(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi)
vmovdqa 512(%rdi), %ymm11
vpaddw 2784(%rsp), %ymm11, %ymm11
vpaddw 2880(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 512(%rdi)
vmovdqa 64(%rdi), %ymm11
vpaddw 2048(%rsp), %ymm11, %ymm11
vpaddw 1920(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 64(%rdi)
vmovdqa 320(%rdi), %ymm11
vpaddw 2304(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 320(%rdi)
vmovdqa 576(%rdi), %ymm11
vpaddw 2560(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 576(%rdi)
vmovdqa 128(%rdi), %ymm11
vpaddw 2080(%rsp), %ymm11, %ymm11
vpaddw 1952(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 128(%rdi)
vmovdqa 384(%rdi), %ymm11
vpaddw 2336(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi)
vmovdqa 640(%rdi), %ymm11
vpaddw 2592(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 640(%rdi)
vmovdqa 192(%rdi), %ymm11
vpaddw 2112(%rsp), %ymm11, %ymm11
vpaddw 1984(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 192(%rdi)
vmovdqa 448(%rdi), %ymm11
vpaddw 2368(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 448(%rdi)
vmovdqa 704(%rdi), %ymm11
vpaddw 2624(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 704(%rdi)
vmovdqa 256(%rdi), %ymm11
vpaddw 2144(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi)
vmovdqa 512(%rdi), %ymm11
vpaddw 2400(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 512(%rdi)
vmovdqa 768(%rdi), %ymm11
vpaddw 2656(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 768(%rdi)
vmovdqa 320(%rdi), %ymm11
vpaddw 2176(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 320(%rdi)
vmovdqa 576(%rdi), %ymm11
vpaddw 2432(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 576(%rdi)
vmovdqa 832(%rdi), %ymm11
vpaddw 2688(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 832(%rdi)
vmovdqa 384(%rdi), %ymm11
vpaddw 2208(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi)
vmovdqa 640(%rdi), %ymm11
vpaddw 2464(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 640(%rdi)
vmovdqa 896(%rdi), %ymm11
vpaddw 2720(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 896(%rdi)
vmovdqa 448(%rdi), %ymm11
vpaddw 2240(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 448(%rdi)
vmovdqa 704(%rdi), %ymm11
vpaddw 2496(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 704(%rdi)
vmovdqa 960(%rdi), %ymm11
vpaddw 2752(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 960(%rdi)
mov %r8, %rsp
pop %r12


+ 1
- 4
crypto_kem/ntruhps2048509/clean/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps2048509/clean/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048509_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS2048509_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS2048509_CLEAN_poly_mod_3_Phi_n(r);
}



+ 277
- 8
crypto_kem/ntruhps2048509/clean/poly_rq_mul.c View File

@@ -1,15 +1,284 @@
#include "poly.h"

/* Polynomial multiplication using */
/* Toom-4 and two layers of Karatsuba. */

#define L PAD32(NTRU_N)
#define M (L/4)
#define K (L/16)

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);

static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]);
static inline void k2x2_eval(uint16_t r[9 * K]);

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]);
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]);

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]);
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]);

void PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) {
int k, i;
size_t i;
uint16_t ab[2 * L];

for (k = 0; k < NTRU_N; k++) {
r->coeffs[k] = 0;
for (i = 1; i < NTRU_N - k; i++) {
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
}
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i];
for (i = 0; i < NTRU_N; i++) {
ab[i] = a->coeffs[i];
ab[L + i] = b->coeffs[i];
}
for (i = NTRU_N; i < L; i++) {
ab[i] = 0;
ab[L + i] = 0;
}

toom4_k2x2_mul(ab, ab, ab + L);

for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = ab[i] + ab[NTRU_N + i];
}
}

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) {
uint16_t tmpA[9 * K];
uint16_t tmpB[9 * K];
uint16_t eC[63 * 2 * K];

toom4_k2x2_eval_0(tmpA, a);
toom4_k2x2_eval_0(tmpB, b);
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p1(tmpA, a);
toom4_k2x2_eval_p1(tmpB, b);
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m1(tmpA, a);
toom4_k2x2_eval_m1(tmpB, b);
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p2(tmpA, a);
toom4_k2x2_eval_p2(tmpB, b);
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m2(tmpA, a);
toom4_k2x2_eval_m2(tmpB, b);
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p3(tmpA, a);
toom4_k2x2_eval_p3(tmpB, b);
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_inf(tmpA, a);
toom4_k2x2_eval_inf(tmpB, b);
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_interpolate(ab, eC);
}


static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += a[1 * M + i];
r[i] += a[2 * M + i];
r[i] += a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= a[1 * M + i];
r[i] += a[2 * M + i];
r[i] -= a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] += 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] -= 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 3 * a[1 * M + i];
r[i] += 9 * a[2 * M + i];
r[i] += 27 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[3 * M + i];
}
k2x2_eval(r);
}

static inline void k2x2_eval(uint16_t r[9 * K]) {
/* Input: e + f.Y + g.Y^2 + h.Y^3 */
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */

size_t i;
for (i = 0; i < 4 * K; i++) {
r[4 * K + i] = r[i];
}
for (i = 0; i < K; i++) {
r[4 * K + i] += r[1 * K + i];
r[5 * K + i] += r[3 * K + i];
r[6 * K + i] += r[0 * K + i];
r[7 * K + i] += r[2 * K + i];
r[8 * K + i] = r[5 * K + i];
r[8 * K + i] += r[6 * K + i];
}
}

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) {
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K);
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K);
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K);
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K);
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K);
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K);
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K);
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K);
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K);
}

static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) {
size_t i, j;
for (j = 0; j < K; j++) {
r[j] = a[0] * b[j];
}
for (i = 1; i < K; i++) {
for (j = 0; j < K - 1; j++) {
r[i + j] += a[i] * b[j];
}
r[i + K - 1] = a[i] * b[K - 1];
}
r[2 * K - 1] = 0;
}

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) {
size_t i;

uint16_t P1[2 * M];
uint16_t Pm1[2 * M];
uint16_t P2[2 * M];
uint16_t Pm2[2 * M];

uint16_t *C0 = r;
uint16_t *C2 = r + 2 * M;
uint16_t *C4 = r + 4 * M;
uint16_t *C6 = r + 6 * M;

uint16_t V0, V1, V2;

k2x2_interpolate(C0, a + 0 * 9 * 2 * K);
k2x2_interpolate(P1, a + 1 * 9 * 2 * K);
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K);
k2x2_interpolate(P2, a + 3 * 9 * 2 * K);
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K);
k2x2_interpolate(C6, a + 6 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1;
V0 = V0 - C0[i] - C6[i];
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3;
C4[i] = 43691 * (V1 - V0);
C2[i] = V0 - C4[i];
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1;
}

/* reuse Pm1 for P3 */
#define P3 Pm1
k2x2_interpolate(P3, a + 5 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = P1[i];
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0);
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i])));
V2 = ((uint32_t)(V2 - V0)) >> 3;
V2 -= V1;
P3[i] = 52429 * V2;
P2[i] = V1 - V2;
P1[i] = V0 - P2[i] - P3[i];
}

for (i = 0; i < 2 * M; i++) {
r[1 * M + i] += P1[i];
r[3 * M + i] += P2[i];
r[5 * M + i] += P3[i];
}
}

static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) {
size_t i;
uint16_t tmp[4 * K];

for (i = 0; i < 2 * K; i++) {
r[0 * K + i] = a[0 * K + i];
r[2 * K + i] = a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[4 * K + i] = a[4 * K + i];
r[6 * K + i] = a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[0 * K + i] = a[12 * K + i];
tmp[2 * K + i] = a[10 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i];
}

for (i = 0; i < 4 * K; i++) {
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i];
}

for (i = 0; i < 4 * K; i++) {
r[2 * K + i] += tmp[0 * K + i];
}
}


+ 2
- 2
crypto_kem/ntruhps2048677/META.yml View File

@@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang
implementations:
- name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms:
- architecture: x86_64
operating_systems:


+ 1
- 4
crypto_kem/ntruhps2048677/avx2/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps2048677/avx2/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048677_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS2048677_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS2048677_AVX2_poly_mod_3_Phi_n(r);
}



+ 0
- 185
crypto_kem/ntruhps2048677/avx2/poly_rq_mul.s View File

@@ -237,23 +237,6 @@ mask_15_1:
.word 65535
.word 65535
.word 0
mask_mod2048:
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.word 2047
.text
.global PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul
.global _PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul
@@ -5139,31 +5122,24 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 0(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 0(%rdi)
vmovdqu 352(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 352(%rdi)
vmovdqu 704(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 704(%rdi)
vmovdqu 1056(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1056(%rdi)
vmovdqu 54(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 54(%rdi)
vmovdqu 406(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 406(%rdi)
vmovdqu 758(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 758(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8
@@ -5231,31 +5207,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 88(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 88(%rdi)
vmovdqu 440(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 440(%rdi)
vmovdqu 792(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 792(%rdi)
vmovdqu 1144(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1144(%rdi)
vmovdqu 142(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 142(%rdi)
vmovdqu 494(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 494(%rdi)
vmovdqu 846(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 846(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4
@@ -5323,31 +5292,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 176(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 176(%rdi)
vmovdqu 528(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 528(%rdi)
vmovdqu 880(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 880(%rdi)
vmovdqu 1232(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1232(%rdi)
vmovdqu 230(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 230(%rdi)
vmovdqu 582(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 582(%rdi)
vmovdqu 934(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 934(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9
@@ -5415,31 +5377,24 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 264(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 264(%rdi)
vmovdqu 616(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 616(%rdi)
vmovdqu 968(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 968(%rdi)
vmovdqu 1320(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1320(%rdi)
vmovdqu 318(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 318(%rdi)
vmovdqu 670(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 670(%rdi)
vmovdqu 1022(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1022(%rdi)
vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7
@@ -5507,31 +5462,24 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 352(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 352(%rdi)
vmovdqu 704(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 704(%rdi)
vmovdqu 1056(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1056(%rdi)
vmovdqu 54(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 54(%rdi)
vmovdqu 406(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 406(%rdi)
vmovdqu 758(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 758(%rdi)
vmovdqu 1110(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1110(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -5599,31 +5547,24 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 440(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 440(%rdi)
vmovdqu 792(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 792(%rdi)
vmovdqu 1144(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1144(%rdi)
vmovdqu 142(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 142(%rdi)
vmovdqu 494(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 494(%rdi)
vmovdqu 846(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 846(%rdi)
vmovdqu 1198(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1198(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10
@@ -5691,31 +5632,24 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 528(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 528(%rdi)
vmovdqu 880(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 880(%rdi)
vmovdqu 1232(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1232(%rdi)
vmovdqu 230(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 230(%rdi)
vmovdqu 582(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 582(%rdi)
vmovdqu 934(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 934(%rdi)
vmovdqu 1286(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1286(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8
@@ -5783,31 +5717,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 616(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 616(%rdi)
vmovdqu 968(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 968(%rdi)
vmovdqu 1320(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1320(%rdi)
vmovdqu 318(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 318(%rdi)
vmovdqu 670(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 670(%rdi)
vmovdqu 1022(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1022(%rdi)
vmovdqu 1374(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1374(%rdi)
vmovdqa 128(%r12), %ymm0
vpsubw 224(%r12), %ymm0, %ymm0
@@ -6176,31 +6103,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 32(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 32(%rdi)
vmovdqu 384(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 384(%rdi)
vmovdqu 736(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 736(%rdi)
vmovdqu 1088(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1088(%rdi)
vmovdqu 86(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 86(%rdi)
vmovdqu 438(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 438(%rdi)
vmovdqu 790(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 790(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9
@@ -6268,31 +6188,24 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 120(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 120(%rdi)
vmovdqu 472(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 472(%rdi)
vmovdqu 824(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 824(%rdi)
vmovdqu 1176(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1176(%rdi)
vmovdqu 174(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 174(%rdi)
vmovdqu 526(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 526(%rdi)
vmovdqu 878(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 878(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7
@@ -6360,31 +6273,24 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 208(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 208(%rdi)
vmovdqu 560(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 560(%rdi)
vmovdqu 912(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 912(%rdi)
vmovdqu 1264(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1264(%rdi)
vmovdqu 262(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 262(%rdi)
vmovdqu 614(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 614(%rdi)
vmovdqu 966(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 966(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -6452,20 +6358,16 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 296(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 296(%rdi)
vmovdqu 648(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 648(%rdi)
vmovdqu 1000(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1000(%rdi)
vmovdqu 1352(%rdi), %ymm4
vpand mask_1_15(%rip), %ymm8, %ymm3
vpaddw %ymm4, %ymm3, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1352(%rdi)
vpshufb rol_rol_16(%rip), %ymm8, %ymm8
vpermq $216, %ymm8, %ymm8
@@ -6474,19 +6376,15 @@ vpermq $216, %ymm8, %ymm8
vpand mask_15_1(%rip), %ymm8, %ymm8
vmovdqu 0(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 0(%rdi)
vmovdqu 350(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 350(%rdi)
vmovdqu 702(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 702(%rdi)
vmovdqu 1054(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1054(%rdi)
vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10
@@ -6554,31 +6452,24 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 384(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 384(%rdi)
vmovdqu 736(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 736(%rdi)
vmovdqu 1088(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1088(%rdi)
vmovdqu 86(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 86(%rdi)
vmovdqu 438(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 438(%rdi)
vmovdqu 790(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 790(%rdi)
vmovdqu 1142(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1142(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8
@@ -6646,31 +6537,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 472(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 472(%rdi)
vmovdqu 824(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 824(%rdi)
vmovdqu 1176(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1176(%rdi)
vmovdqu 174(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 174(%rdi)
vmovdqu 526(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 526(%rdi)
vmovdqu 878(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 878(%rdi)
vmovdqu 1230(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1230(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4
@@ -6738,31 +6622,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 560(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 560(%rdi)
vmovdqu 912(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 912(%rdi)
vmovdqu 1264(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1264(%rdi)
vmovdqu 262(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 262(%rdi)
vmovdqu 614(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 614(%rdi)
vmovdqu 966(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 966(%rdi)
vmovdqu 1318(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1318(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9
@@ -6830,16 +6707,13 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 648(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 648(%rdi)
vmovdqu 1000(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1000(%rdi)
vmovdqu 1352(%rdi), %ymm10
vpand mask_1_15(%rip), %ymm4, %ymm9
vpaddw %ymm10, %ymm9, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1352(%rdi)
vpshufb rol_rol_16(%rip), %ymm4, %ymm4
vpermq $216, %ymm4, %ymm4
@@ -6848,19 +6722,15 @@ vpermq $216, %ymm4, %ymm4
vpand mask_15_1(%rip), %ymm4, %ymm4
vmovdqu 0(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 0(%rdi)
vmovdqu 350(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 350(%rdi)
vmovdqu 702(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 702(%rdi)
vmovdqu 1054(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1054(%rdi)
vmovdqa 160(%r12), %ymm0
vpsubw 256(%r12), %ymm0, %ymm0
@@ -7229,43 +7099,36 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 64(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 64(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 80(%rdi)
vmovdqu 416(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 416(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 432(%rdi)
vmovdqu 768(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 768(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 784(%rdi)
vmovdqu 1120(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1120(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1136(%rdi)
vmovdqu 118(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 118(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 134(%rdi)
vmovdqu 470(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 470(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 486(%rdi)
vmovdqu 822(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 822(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 838(%rdi)
@@ -7335,43 +7198,36 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 152(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 152(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 168(%rdi)
vmovdqu 504(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 504(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 520(%rdi)
vmovdqu 856(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 856(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 872(%rdi)
vmovdqu 1208(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1208(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1224(%rdi)
vmovdqu 206(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 206(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 222(%rdi)
vmovdqu 558(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 558(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 574(%rdi)
vmovdqu 910(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 910(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 926(%rdi)
@@ -7441,43 +7297,36 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 240(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 240(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 256(%rdi)
vmovdqu 592(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 592(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 608(%rdi)
vmovdqu 944(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 944(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 960(%rdi)
vmovdqu 1296(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 1296(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 1312(%rdi)
vmovdqu 294(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 294(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 310(%rdi)
vmovdqu 646(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 646(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 662(%rdi)
vmovdqu 998(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 998(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 1014(%rdi)
@@ -7547,43 +7396,36 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 328(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 328(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 344(%rdi)
vmovdqu 680(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 680(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 696(%rdi)
vmovdqu 1032(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1032(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1048(%rdi)
vmovdqu 30(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 30(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 46(%rdi)
vmovdqu 382(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 382(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 398(%rdi)
vmovdqu 734(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 734(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 750(%rdi)
vmovdqu 1086(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1086(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1102(%rdi)
@@ -7653,43 +7495,36 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 416(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 416(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 432(%rdi)
vmovdqu 768(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 768(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 784(%rdi)
vmovdqu 1120(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1120(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1136(%rdi)
vmovdqu 118(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 118(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 134(%rdi)
vmovdqu 470(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 470(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 486(%rdi)
vmovdqu 822(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 822(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 838(%rdi)
vmovdqu 1174(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1174(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1190(%rdi)
@@ -7759,43 +7594,36 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 504(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 504(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 520(%rdi)
vmovdqu 856(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 856(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 872(%rdi)
vmovdqu 1208(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 1208(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 1224(%rdi)
vmovdqu 206(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 206(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 222(%rdi)
vmovdqu 558(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 558(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 574(%rdi)
vmovdqu 910(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 910(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 926(%rdi)
vmovdqu 1262(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 1262(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 1278(%rdi)
@@ -7865,43 +7693,36 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 592(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 592(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 608(%rdi)
vmovdqu 944(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 944(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 960(%rdi)
vmovdqu 1296(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1296(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1312(%rdi)
vmovdqu 294(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 294(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 310(%rdi)
vmovdqu 646(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 646(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 662(%rdi)
vmovdqu 998(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 998(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1014(%rdi)
vmovdqu 1350(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1350(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1366(%rdi)
@@ -7971,37 +7792,31 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 680(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 680(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 696(%rdi)
vmovdqu 1032(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1032(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1048(%rdi)
vmovdqu 30(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 30(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 46(%rdi)
vmovdqu 382(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 382(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 398(%rdi)
vmovdqu 734(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 734(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 750(%rdi)
vmovdqu 1086(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1086(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1102(%rdi)


+ 1
- 4
crypto_kem/ntruhps2048677/clean/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps2048677/clean/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048677_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS2048677_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS2048677_CLEAN_poly_mod_3_Phi_n(r);
}



+ 277
- 8
crypto_kem/ntruhps2048677/clean/poly_rq_mul.c View File

@@ -1,15 +1,284 @@
#include "poly.h"

/* Polynomial multiplication using */
/* Toom-4 and two layers of Karatsuba. */

#define L PAD32(NTRU_N)
#define M (L/4)
#define K (L/16)

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);

static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]);
static inline void k2x2_eval(uint16_t r[9 * K]);

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]);
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]);

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]);
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]);

void PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) {
int k, i;
size_t i;
uint16_t ab[2 * L];

for (k = 0; k < NTRU_N; k++) {
r->coeffs[k] = 0;
for (i = 1; i < NTRU_N - k; i++) {
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
}
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i];
for (i = 0; i < NTRU_N; i++) {
ab[i] = a->coeffs[i];
ab[L + i] = b->coeffs[i];
}
for (i = NTRU_N; i < L; i++) {
ab[i] = 0;
ab[L + i] = 0;
}

toom4_k2x2_mul(ab, ab, ab + L);

for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = ab[i] + ab[NTRU_N + i];
}
}

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) {
uint16_t tmpA[9 * K];
uint16_t tmpB[9 * K];
uint16_t eC[63 * 2 * K];

toom4_k2x2_eval_0(tmpA, a);
toom4_k2x2_eval_0(tmpB, b);
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p1(tmpA, a);
toom4_k2x2_eval_p1(tmpB, b);
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m1(tmpA, a);
toom4_k2x2_eval_m1(tmpB, b);
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p2(tmpA, a);
toom4_k2x2_eval_p2(tmpB, b);
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m2(tmpA, a);
toom4_k2x2_eval_m2(tmpB, b);
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p3(tmpA, a);
toom4_k2x2_eval_p3(tmpB, b);
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_inf(tmpA, a);
toom4_k2x2_eval_inf(tmpB, b);
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_interpolate(ab, eC);
}


static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += a[1 * M + i];
r[i] += a[2 * M + i];
r[i] += a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= a[1 * M + i];
r[i] += a[2 * M + i];
r[i] -= a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] += 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] -= 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 3 * a[1 * M + i];
r[i] += 9 * a[2 * M + i];
r[i] += 27 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[3 * M + i];
}
k2x2_eval(r);
}

static inline void k2x2_eval(uint16_t r[9 * K]) {
/* Input: e + f.Y + g.Y^2 + h.Y^3 */
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */

size_t i;
for (i = 0; i < 4 * K; i++) {
r[4 * K + i] = r[i];
}
for (i = 0; i < K; i++) {
r[4 * K + i] += r[1 * K + i];
r[5 * K + i] += r[3 * K + i];
r[6 * K + i] += r[0 * K + i];
r[7 * K + i] += r[2 * K + i];
r[8 * K + i] = r[5 * K + i];
r[8 * K + i] += r[6 * K + i];
}
}

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) {
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K);
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K);
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K);
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K);
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K);
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K);
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K);
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K);
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K);
}

static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) {
size_t i, j;
for (j = 0; j < K; j++) {
r[j] = a[0] * b[j];
}
for (i = 1; i < K; i++) {
for (j = 0; j < K - 1; j++) {
r[i + j] += a[i] * b[j];
}
r[i + K - 1] = a[i] * b[K - 1];
}
r[2 * K - 1] = 0;
}

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) {
size_t i;

uint16_t P1[2 * M];
uint16_t Pm1[2 * M];
uint16_t P2[2 * M];
uint16_t Pm2[2 * M];

uint16_t *C0 = r;
uint16_t *C2 = r + 2 * M;
uint16_t *C4 = r + 4 * M;
uint16_t *C6 = r + 6 * M;

uint16_t V0, V1, V2;

k2x2_interpolate(C0, a + 0 * 9 * 2 * K);
k2x2_interpolate(P1, a + 1 * 9 * 2 * K);
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K);
k2x2_interpolate(P2, a + 3 * 9 * 2 * K);
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K);
k2x2_interpolate(C6, a + 6 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1;
V0 = V0 - C0[i] - C6[i];
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3;
C4[i] = 43691 * (V1 - V0);
C2[i] = V0 - C4[i];
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1;
}

/* reuse Pm1 for P3 */
#define P3 Pm1
k2x2_interpolate(P3, a + 5 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = P1[i];
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0);
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i])));
V2 = ((uint32_t)(V2 - V0)) >> 3;
V2 -= V1;
P3[i] = 52429 * V2;
P2[i] = V1 - V2;
P1[i] = V0 - P2[i] - P3[i];
}

for (i = 0; i < 2 * M; i++) {
r[1 * M + i] += P1[i];
r[3 * M + i] += P2[i];
r[5 * M + i] += P3[i];
}
}

static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) {
size_t i;
uint16_t tmp[4 * K];

for (i = 0; i < 2 * K; i++) {
r[0 * K + i] = a[0 * K + i];
r[2 * K + i] = a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[4 * K + i] = a[4 * K + i];
r[6 * K + i] = a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[0 * K + i] = a[12 * K + i];
tmp[2 * K + i] = a[10 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i];
}

for (i = 0; i < 4 * K; i++) {
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i];
}

for (i = 0; i < 4 * K; i++) {
r[2 * K + i] += tmp[0 * K + i];
}
}


+ 2
- 2
crypto_kem/ntruhps4096821/META.yml View File

@@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang
implementations:
- name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms:
- architecture: x86_64
operating_systems:


+ 1
- 4
crypto_kem/ntruhps4096821/avx2/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps4096821/avx2/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS4096821_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS4096821_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS4096821_AVX2_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS4096821_AVX2_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS4096821_AVX2_poly_mod_3_Phi_n(r);
}



+ 0
- 241
crypto_kem/ntruhps4096821/avx2/poly_rq_mul.s
File diff suppressed because it is too large
View File


+ 1
- 4
crypto_kem/ntruhps4096821/clean/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhps4096821/clean/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS4096821_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly
}

void PQCLEAN_NTRUHPS4096821_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHPS4096821_CLEAN_poly_mod_3_Phi_n(r);
}



+ 277
- 8
crypto_kem/ntruhps4096821/clean/poly_rq_mul.c View File

@@ -1,15 +1,284 @@
#include "poly.h"

/* Polynomial multiplication using */
/* Toom-4 and two layers of Karatsuba. */

#define L PAD32(NTRU_N)
#define M (L/4)
#define K (L/16)

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);

static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]);
static inline void k2x2_eval(uint16_t r[9 * K]);

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]);
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]);

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]);
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]);

void PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) {
int k, i;
size_t i;
uint16_t ab[2 * L];

for (k = 0; k < NTRU_N; k++) {
r->coeffs[k] = 0;
for (i = 1; i < NTRU_N - k; i++) {
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
}
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i];
for (i = 0; i < NTRU_N; i++) {
ab[i] = a->coeffs[i];
ab[L + i] = b->coeffs[i];
}
for (i = NTRU_N; i < L; i++) {
ab[i] = 0;
ab[L + i] = 0;
}

toom4_k2x2_mul(ab, ab, ab + L);

for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = ab[i] + ab[NTRU_N + i];
}
}

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) {
uint16_t tmpA[9 * K];
uint16_t tmpB[9 * K];
uint16_t eC[63 * 2 * K];

toom4_k2x2_eval_0(tmpA, a);
toom4_k2x2_eval_0(tmpB, b);
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p1(tmpA, a);
toom4_k2x2_eval_p1(tmpB, b);
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m1(tmpA, a);
toom4_k2x2_eval_m1(tmpB, b);
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p2(tmpA, a);
toom4_k2x2_eval_p2(tmpB, b);
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m2(tmpA, a);
toom4_k2x2_eval_m2(tmpB, b);
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p3(tmpA, a);
toom4_k2x2_eval_p3(tmpB, b);
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_inf(tmpA, a);
toom4_k2x2_eval_inf(tmpB, b);
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_interpolate(ab, eC);
}


static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += a[1 * M + i];
r[i] += a[2 * M + i];
r[i] += a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= a[1 * M + i];
r[i] += a[2 * M + i];
r[i] -= a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] += 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] -= 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 3 * a[1 * M + i];
r[i] += 9 * a[2 * M + i];
r[i] += 27 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[3 * M + i];
}
k2x2_eval(r);
}

static inline void k2x2_eval(uint16_t r[9 * K]) {
/* Input: e + f.Y + g.Y^2 + h.Y^3 */
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */

size_t i;
for (i = 0; i < 4 * K; i++) {
r[4 * K + i] = r[i];
}
for (i = 0; i < K; i++) {
r[4 * K + i] += r[1 * K + i];
r[5 * K + i] += r[3 * K + i];
r[6 * K + i] += r[0 * K + i];
r[7 * K + i] += r[2 * K + i];
r[8 * K + i] = r[5 * K + i];
r[8 * K + i] += r[6 * K + i];
}
}

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) {
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K);
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K);
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K);
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K);
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K);
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K);
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K);
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K);
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K);
}

static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) {
size_t i, j;
for (j = 0; j < K; j++) {
r[j] = a[0] * b[j];
}
for (i = 1; i < K; i++) {
for (j = 0; j < K - 1; j++) {
r[i + j] += a[i] * b[j];
}
r[i + K - 1] = a[i] * b[K - 1];
}
r[2 * K - 1] = 0;
}

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) {
size_t i;

uint16_t P1[2 * M];
uint16_t Pm1[2 * M];
uint16_t P2[2 * M];
uint16_t Pm2[2 * M];

uint16_t *C0 = r;
uint16_t *C2 = r + 2 * M;
uint16_t *C4 = r + 4 * M;
uint16_t *C6 = r + 6 * M;

uint16_t V0, V1, V2;

k2x2_interpolate(C0, a + 0 * 9 * 2 * K);
k2x2_interpolate(P1, a + 1 * 9 * 2 * K);
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K);
k2x2_interpolate(P2, a + 3 * 9 * 2 * K);
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K);
k2x2_interpolate(C6, a + 6 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1;
V0 = V0 - C0[i] - C6[i];
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3;
C4[i] = 43691 * (V1 - V0);
C2[i] = V0 - C4[i];
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1;
}

/* reuse Pm1 for P3 */
#define P3 Pm1
k2x2_interpolate(P3, a + 5 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = P1[i];
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0);
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i])));
V2 = ((uint32_t)(V2 - V0)) >> 3;
V2 -= V1;
P3[i] = 52429 * V2;
P2[i] = V1 - V2;
P1[i] = V0 - P2[i] - P3[i];
}

for (i = 0; i < 2 * M; i++) {
r[1 * M + i] += P1[i];
r[3 * M + i] += P2[i];
r[5 * M + i] += P3[i];
}
}

static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) {
size_t i;
uint16_t tmp[4 * K];

for (i = 0; i < 2 * K; i++) {
r[0 * K + i] = a[0 * K + i];
r[2 * K + i] = a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[4 * K + i] = a[4 * K + i];
r[6 * K + i] = a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[0 * K + i] = a[12 * K + i];
tmp[2 * K + i] = a[10 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i];
}

for (i = 0; i < 4 * K; i++) {
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i];
}

for (i = 0; i < 4 * K; i++) {
r[2 * K + i] += tmp[0 * K + i];
}
}


+ 2
- 2
crypto_kem/ntruhrss701/META.yml View File

@@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang
implementations:
- name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms:
- architecture: x86_64
operating_systems:


+ 1
- 4
crypto_kem/ntruhrss701/avx2/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHRSS701_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHRSS701_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHRSS701_AVX2_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhrss701/avx2/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHRSS701_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly *b)
}

void PQCLEAN_NTRUHRSS701_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHRSS701_AVX2_poly_mod_3_Phi_n(r);
}



+ 18
- 156
crypto_kem/ntruhrss701/avx2/poly_lift.s View File

@@ -237,23 +237,6 @@ shuf_128_to_64:
.byte 255
.byte 255
.byte 255
const_1s:
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
.word 1
const_modq:
.word 8191
.word 8191
@@ -288,57 +271,23 @@ mask_n:
.word 0
.word 0
.word 0
mask_mod8192:
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
mask_mod8192_omit_lowest:
.word 0
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
mask_mod8192_only_lowest:
.word 8191
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
mask_omit_lowest:
.word 0
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
.word 0xFFFF
shuf_5_to_0_zerorest:
.byte 10
.byte 11
@@ -2161,7 +2110,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 0(%rsp)
vpaddw 32(%rsp), %ymm1, %ymm2
@@ -2185,7 +2133,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 32(%rsp)
vpaddw 64(%rsp), %ymm1, %ymm2
@@ -2209,7 +2156,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 64(%rsp)
vpaddw 96(%rsp), %ymm1, %ymm2
@@ -2233,7 +2179,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 96(%rsp)
vpaddw 128(%rsp), %ymm1, %ymm2
@@ -2257,7 +2202,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 128(%rsp)
vpaddw 160(%rsp), %ymm1, %ymm2
@@ -2281,7 +2225,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 160(%rsp)
vpaddw 192(%rsp), %ymm1, %ymm2
@@ -2305,7 +2248,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 192(%rsp)
vpaddw 224(%rsp), %ymm1, %ymm2
@@ -2329,7 +2271,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 224(%rsp)
vpaddw 256(%rsp), %ymm1, %ymm2
@@ -2353,7 +2294,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 256(%rsp)
vpaddw 288(%rsp), %ymm1, %ymm2
@@ -2377,7 +2317,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 288(%rsp)
vpaddw 320(%rsp), %ymm1, %ymm2
@@ -2401,7 +2340,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 320(%rsp)
vpaddw 352(%rsp), %ymm1, %ymm2
@@ -2425,7 +2363,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 352(%rsp)
vpaddw 384(%rsp), %ymm1, %ymm2
@@ -2449,7 +2386,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 384(%rsp)
vpaddw 416(%rsp), %ymm1, %ymm2
@@ -2473,7 +2409,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 416(%rsp)
vpaddw 448(%rsp), %ymm1, %ymm2
@@ -2497,7 +2432,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 448(%rsp)
vpaddw 480(%rsp), %ymm1, %ymm2
@@ -2521,7 +2455,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 480(%rsp)
vpaddw 512(%rsp), %ymm1, %ymm2
@@ -2545,7 +2478,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 512(%rsp)
vpaddw 544(%rsp), %ymm1, %ymm2
@@ -2569,7 +2501,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 544(%rsp)
vpaddw 576(%rsp), %ymm1, %ymm2
@@ -2593,7 +2524,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 576(%rsp)
vpaddw 608(%rsp), %ymm1, %ymm2
@@ -2617,7 +2547,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 608(%rsp)
vpaddw 640(%rsp), %ymm1, %ymm2
@@ -2641,7 +2570,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 640(%rsp)
vpaddw 672(%rsp), %ymm1, %ymm2
@@ -2665,7 +2593,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 672(%rsp)
vpaddw 704(%rsp), %ymm1, %ymm2
@@ -2689,7 +2616,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 704(%rsp)
vpaddw 736(%rsp), %ymm1, %ymm2
@@ -2713,7 +2639,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 736(%rsp)
vpaddw 768(%rsp), %ymm1, %ymm2
@@ -2737,7 +2662,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 768(%rsp)
vpaddw 800(%rsp), %ymm1, %ymm2
@@ -2761,7 +2685,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 800(%rsp)
vpaddw 832(%rsp), %ymm1, %ymm2
@@ -2785,7 +2708,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 832(%rsp)
vpaddw 864(%rsp), %ymm1, %ymm2
@@ -2809,7 +2731,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 864(%rsp)
vpaddw 896(%rsp), %ymm1, %ymm2
@@ -2833,7 +2754,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 896(%rsp)
vpaddw 928(%rsp), %ymm1, %ymm2
@@ -2857,7 +2777,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 928(%rsp)
vpaddw 960(%rsp), %ymm1, %ymm2
@@ -2881,7 +2800,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 960(%rsp)
vpaddw 992(%rsp), %ymm1, %ymm2
@@ -2905,7 +2823,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 992(%rsp)
vpaddw 1024(%rsp), %ymm1, %ymm2
@@ -2929,7 +2846,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1024(%rsp)
vpaddw 1056(%rsp), %ymm1, %ymm2
@@ -2953,7 +2869,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1056(%rsp)
vpaddw 1088(%rsp), %ymm1, %ymm2
@@ -2977,7 +2892,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1088(%rsp)
vpaddw 1120(%rsp), %ymm1, %ymm2
@@ -3001,7 +2915,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1120(%rsp)
vpaddw 1152(%rsp), %ymm1, %ymm2
@@ -3025,7 +2938,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1152(%rsp)
vpaddw 1184(%rsp), %ymm1, %ymm2
@@ -3049,7 +2961,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1184(%rsp)
vpaddw 1216(%rsp), %ymm1, %ymm2
@@ -3073,7 +2984,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1216(%rsp)
vpaddw 1248(%rsp), %ymm1, %ymm2
@@ -3097,7 +3007,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1248(%rsp)
vpaddw 1280(%rsp), %ymm1, %ymm2
@@ -3121,7 +3030,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1280(%rsp)
vpaddw 1312(%rsp), %ymm1, %ymm2
@@ -3145,7 +3053,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1312(%rsp)
vpaddw 1344(%rsp), %ymm1, %ymm2
@@ -3169,7 +3076,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1344(%rsp)
vpaddw 1376(%rsp), %ymm1, %ymm2
@@ -3193,184 +3099,140 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1376(%rsp)
vmovdqu 1374(%rsp), %ymm0
vpsubw 1376(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1376(%rdi)
vextracti128 $1, %ymm0, %xmm4
vpshufb shuf_5_to_0_zerorest(%rip), %ymm4, %ymm4
vpsubw 0(%rsp), %ymm4, %ymm4
vpand mask_mod8192_only_lowest(%rip), %ymm4, %ymm4
vpand coeff_0(%rip), %ymm4, %ymm4
vmovdqu 1342(%rsp), %ymm0
vpsubw 1344(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1344(%rdi)
vmovdqu 1310(%rsp), %ymm0
vpsubw 1312(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1312(%rdi)
vmovdqu 1278(%rsp), %ymm0
vpsubw 1280(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1280(%rdi)
vmovdqu 1246(%rsp), %ymm0
vpsubw 1248(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1248(%rdi)
vmovdqu 1214(%rsp), %ymm0
vpsubw 1216(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1216(%rdi)
vmovdqu 1182(%rsp), %ymm0
vpsubw 1184(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1184(%rdi)
vmovdqu 1150(%rsp), %ymm0
vpsubw 1152(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1152(%rdi)
vmovdqu 1118(%rsp), %ymm0
vpsubw 1120(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1120(%rdi)
vmovdqu 1086(%rsp), %ymm0
vpsubw 1088(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1088(%rdi)
vmovdqu 1054(%rsp), %ymm0
vpsubw 1056(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1056(%rdi)
vmovdqu 1022(%rsp), %ymm0
vpsubw 1024(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1024(%rdi)
vmovdqu 990(%rsp), %ymm0
vpsubw 992(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 992(%rdi)
vmovdqu 958(%rsp), %ymm0
vpsubw 960(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 960(%rdi)
vmovdqu 926(%rsp), %ymm0
vpsubw 928(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 928(%rdi)
vmovdqu 894(%rsp), %ymm0
vpsubw 896(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 896(%rdi)
vmovdqu 862(%rsp), %ymm0
vpsubw 864(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 864(%rdi)
vmovdqu 830(%rsp), %ymm0
vpsubw 832(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 832(%rdi)
vmovdqu 798(%rsp), %ymm0
vpsubw 800(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 800(%rdi)
vmovdqu 766(%rsp), %ymm0
vpsubw 768(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 768(%rdi)
vmovdqu 734(%rsp), %ymm0
vpsubw 736(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 736(%rdi)
vmovdqu 702(%rsp), %ymm0
vpsubw 704(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 704(%rdi)
vmovdqu 670(%rsp), %ymm0
vpsubw 672(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 672(%rdi)
vmovdqu 638(%rsp), %ymm0
vpsubw 640(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 640(%rdi)
vmovdqu 606(%rsp), %ymm0
vpsubw 608(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 608(%rdi)
vmovdqu 574(%rsp), %ymm0
vpsubw 576(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 576(%rdi)
vmovdqu 542(%rsp), %ymm0
vpsubw 544(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 544(%rdi)
vmovdqu 510(%rsp), %ymm0
vpsubw 512(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 512(%rdi)
vmovdqu 478(%rsp), %ymm0
vpsubw 480(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 480(%rdi)
vmovdqu 446(%rsp), %ymm0
vpsubw 448(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 448(%rdi)
vmovdqu 414(%rsp), %ymm0
vpsubw 416(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 416(%rdi)
vmovdqu 382(%rsp), %ymm0
vpsubw 384(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 384(%rdi)
vmovdqu 350(%rsp), %ymm0
vpsubw 352(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 352(%rdi)
vmovdqu 318(%rsp), %ymm0
vpsubw 320(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 320(%rdi)
vmovdqu 286(%rsp), %ymm0
vpsubw 288(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 288(%rdi)
vmovdqu 254(%rsp), %ymm0
vpsubw 256(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 256(%rdi)
vmovdqu 222(%rsp), %ymm0
vpsubw 224(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 224(%rdi)
vmovdqu 190(%rsp), %ymm0
vpsubw 192(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 192(%rdi)
vmovdqu 158(%rsp), %ymm0
vpsubw 160(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 160(%rdi)
vmovdqu 126(%rsp), %ymm0
vpsubw 128(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 128(%rdi)
vmovdqu 94(%rsp), %ymm0
vpsubw 96(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 96(%rdi)
vmovdqu 62(%rsp), %ymm0
vpsubw 64(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 64(%rdi)
vmovdqu 30(%rsp), %ymm0
vpsubw 32(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 32(%rdi)
vmovdqa 0(%rsp), %ymm3
vpsrlq $48, %ymm3, %ymm0
@@ -3378,7 +3240,7 @@ vpermq $147, %ymm0, %ymm0
vpsllq $16, %ymm3, %ymm2
vpxor %ymm0, %ymm2, %ymm2
vpsubw %ymm3, %ymm2, %ymm3
vpand mask_mod8192_omit_lowest(%rip), %ymm3, %ymm3
vpand mask_omit_lowest(%rip), %ymm3, %ymm3
vpxor %ymm3, %ymm4, %ymm3
vmovdqa %ymm3, 0(%rdi)
mov %r8, %rsp


+ 0
- 137
crypto_kem/ntruhrss701/avx2/poly_rq_mul.s View File

@@ -303,23 +303,6 @@ mask_keephigh:
.word 65535
.word 65535
.word 65535
mask_mod8192:
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.word 8191
.text
.global PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul
.global _PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul
@@ -5213,13 +5196,9 @@ vpand mask_keephigh(%rip), %ymm9, %ymm10
vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm9, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 0(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 352(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 704(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1056(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8
@@ -5309,13 +5288,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8
vpor %ymm8, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm7, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 88(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 440(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 792(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1144(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4
@@ -5405,13 +5380,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4
vpor %ymm4, %ymm5, %ymm5
vpaddw %ymm5, %ymm8, %ymm8
vmovdqa %xmm3, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 176(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 528(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 880(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1232(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9
@@ -5501,13 +5472,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9
vpor %ymm9, %ymm11, %ymm11
vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm10, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 264(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 616(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 968(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1320(%rdi)
vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7
@@ -5587,7 +5554,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm10, %ymm10
vmovdqu 0(%rdi), %ymm7
vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 0(%rdi)
vmovdqa %xmm2, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm4, %ymm4
@@ -5614,11 +5580,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm5, %ymm5
vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm2, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 704(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1056(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -5698,7 +5661,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm2, %ymm2
vmovdqu 88(%rdi), %ymm3
vpaddw %ymm2, %ymm3, %ymm3
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 88(%rdi)
vmovdqa %xmm8, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9
@@ -5725,11 +5687,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm11, %ymm11
vpaddw %ymm11, %ymm7, %ymm7
vmovdqa %xmm8, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 440(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 792(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1144(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10
@@ -5809,7 +5768,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm8, %ymm8
vmovdqu 176(%rdi), %ymm10
vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 176(%rdi)
vmovdqa %xmm4, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm7, %ymm7
@@ -5836,11 +5794,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm4, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 880(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1232(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2
@@ -5920,7 +5875,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm4, %ymm4
vmovdqu 264(%rdi), %ymm2
vpaddw %ymm4, %ymm2, %ymm2
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 264(%rdi)
vmovdqa %xmm9, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3
@@ -5947,11 +5901,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm9, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 616(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 968(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1320(%rdi)
vmovdqa 128(%r12), %ymm0
vpsubw 224(%r12), %ymm0, %ymm0
@@ -6345,13 +6296,9 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm3, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 32(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 384(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 736(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1088(%rdi)
vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm4
@@ -6444,13 +6391,9 @@ vpor %ymm4, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm10, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 120(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 472(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 824(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1176(%rdi)
vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm9
@@ -6543,13 +6486,9 @@ vpor %ymm9, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm4, %ymm4
vpaddw %ymm5, %ymm4, %ymm4
vmovdqa %xmm2, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 208(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 560(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 912(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1264(%rdi)
vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3
@@ -6642,13 +6581,9 @@ vpor %ymm3, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm9, %ymm9
vpaddw %ymm11, %ymm9, %ymm9
vmovdqa %xmm8, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 296(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 648(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1000(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 1352(%rdi)
vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10
@@ -6729,7 +6664,6 @@ vpor %ymm10, %ymm8, %ymm8
vmovdqu 32(%rdi), %ymm10
vpaddw 1920(%rsp), %ymm10, %ymm10
vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 32(%rdi)
vmovdqa %xmm7, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9
@@ -6759,11 +6693,8 @@ vpor %ymm10, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm3, %ymm3
vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm7, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 384(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 736(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1088(%rdi)
vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2
@@ -6844,7 +6775,6 @@ vpor %ymm2, %ymm7, %ymm7
vmovdqu 120(%rdi), %ymm2
vpaddw 1952(%rsp), %ymm2, %ymm2
vpaddw %ymm7, %ymm2, %ymm2
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 120(%rdi)
vmovdqa %xmm4, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3
@@ -6874,11 +6804,8 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm10, %ymm10
vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm4, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 472(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 824(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1176(%rdi)
vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm8
@@ -6959,7 +6886,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqu 208(%rdi), %ymm8
vpaddw 1984(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 208(%rdi)
vmovdqa %xmm9, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm10, %ymm10
@@ -6989,11 +6915,8 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm9, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 560(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 912(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 1264(%rdi)
vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm7
@@ -7074,7 +6997,6 @@ vpor %ymm7, %ymm9, %ymm9
vmovdqu 296(%rdi), %ymm7
vpaddw 2016(%rsp), %ymm7, %ymm7
vpaddw %ymm9, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 296(%rdi)
vmovdqa %xmm3, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm2, %ymm2
@@ -7104,11 +7026,8 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm3, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 648(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 1000(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1352(%rdi)
vmovdqa 160(%r12), %ymm0
vpsubw 256(%r12), %ymm0, %ymm0
@@ -7502,19 +7421,15 @@ vpor %ymm4, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm7, %ymm7
vpaddw %ymm5, %ymm7, %ymm7
vmovdqa %xmm2, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 64(%rdi)
vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 80(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 416(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 432(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 768(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 784(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1120(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1136(%rdi)
@@ -7609,19 +7524,15 @@ vpor %ymm9, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm4, %ymm4
vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm8, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 152(%rdi)
vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 168(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 504(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 520(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 856(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 872(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %xmm2, 1208(%rdi)
vextracti128 $1, %ymm2, %xmm2
vmovq %xmm2, 1224(%rdi)
@@ -7716,19 +7627,15 @@ vpor %ymm3, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm9, %ymm9
vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm7, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 240(%rdi)
vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 256(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 592(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 608(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 944(%rdi)
vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 960(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1296(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1312(%rdi)
@@ -7823,25 +7730,21 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm3, %ymm3
vpaddw %ymm11, %ymm3, %ymm3
vmovdqa %xmm4, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 328(%rdi)
vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 344(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm5, %ymm5
vmovdqa %xmm5, 1792(%rsp)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 680(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 696(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm6, %ymm6
vmovdqa %xmm6, 1824(%rsp)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1032(%rdi)
vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1048(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm3, %ymm3
vmovdqa %xmm3, 1856(%rsp)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1384(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1400(%rdi)
@@ -7926,7 +7829,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqu 64(%rdi), %ymm8
vpaddw 1920(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 64(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 80(%rdi)
@@ -7958,15 +7860,12 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm10, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 416(%rdi)
vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 432(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 768(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 784(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %xmm2, 1120(%rdi)
vextracti128 $1, %ymm2, %xmm2
vmovq %xmm2, 1136(%rdi)
@@ -8049,7 +7948,6 @@ vpor %ymm7, %ymm10, %ymm10
vmovdqu 152(%rdi), %ymm7
vpaddw 1952(%rsp), %ymm7, %ymm7
vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 152(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 168(%rdi)
@@ -8081,15 +7979,12 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm9, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 504(%rdi)
vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 520(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 856(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 872(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1208(%rdi)
vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1224(%rdi)
@@ -8172,7 +8067,6 @@ vpor %ymm4, %ymm9, %ymm9
vmovdqu 240(%rdi), %ymm4
vpaddw 1984(%rsp), %ymm4, %ymm4
vpaddw %ymm9, %ymm4, %ymm4
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 240(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 256(%rdi)
@@ -8204,15 +8098,12 @@ vpor %ymm4, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm7, %ymm7
vpaddw %ymm5, %ymm7, %ymm7
vmovdqa %xmm3, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 592(%rdi)
vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 608(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 944(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 960(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1296(%rdi)
vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1312(%rdi)
@@ -8304,7 +8195,6 @@ vpor %ymm10, %ymm3, %ymm3
vmovdqu 328(%rdi), %ymm10
vpaddw 2016(%rsp), %ymm10, %ymm10
vpaddw %ymm3, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 328(%rdi)
vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 344(%rdi)
@@ -8338,119 +8228,92 @@ vpor %ymm10, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm4, %ymm4
vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm2, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 680(%rdi)
vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 696(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 1032(%rdi)
vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 1048(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1384(%rdi)
vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1400(%rdi)
vmovdqu 0(%rdi), %ymm11
vpaddw 1888(%rsp), %ymm11, %ymm11
vpaddw 2816(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 0(%rdi)
vmovdqu 352(%rdi), %ymm11
vpaddw 2528(%rsp), %ymm11, %ymm11
vpaddw 2848(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi)
vmovdqu 704(%rdi), %ymm11
vpaddw 2784(%rsp), %ymm11, %ymm11
vpaddw 2880(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 704(%rdi)
vmovdqu 88(%rdi), %ymm11
vpaddw 2048(%rsp), %ymm11, %ymm11
vpaddw 1920(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 88(%rdi)
vmovdqu 440(%rdi), %ymm11
vpaddw 2304(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 440(%rdi)
vmovdqu 792(%rdi), %ymm11
vpaddw 2560(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 792(%rdi)
vmovdqu 176(%rdi), %ymm11
vpaddw 2080(%rsp), %ymm11, %ymm11
vpaddw 1952(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 176(%rdi)
vmovdqu 528(%rdi), %ymm11
vpaddw 2336(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi)
vmovdqu 880(%rdi), %ymm11
vpaddw 2592(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 880(%rdi)
vmovdqu 264(%rdi), %ymm11
vpaddw 2112(%rsp), %ymm11, %ymm11
vpaddw 1984(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 264(%rdi)
vmovdqu 616(%rdi), %ymm11
vpaddw 2368(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 616(%rdi)
vmovdqu 968(%rdi), %ymm11
vpaddw 2624(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 968(%rdi)
vmovdqu 352(%rdi), %ymm11
vpaddw 2144(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi)
vmovdqu 704(%rdi), %ymm11
vpaddw 2400(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 704(%rdi)
vmovdqu 1056(%rdi), %ymm11
vpaddw 2656(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1056(%rdi)
vmovdqu 440(%rdi), %ymm11
vpaddw 2176(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 440(%rdi)
vmovdqu 792(%rdi), %ymm11
vpaddw 2432(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 792(%rdi)
vmovdqu 1144(%rdi), %ymm11
vpaddw 2688(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1144(%rdi)
vmovdqu 528(%rdi), %ymm11
vpaddw 2208(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi)
vmovdqu 880(%rdi), %ymm11
vpaddw 2464(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 880(%rdi)
vmovdqu 1232(%rdi), %ymm11
vpaddw 2720(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1232(%rdi)
vmovdqu 616(%rdi), %ymm11
vpaddw 2240(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 616(%rdi)
vmovdqu 968(%rdi), %ymm11
vpaddw 2496(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 968(%rdi)
vmovdqu 1320(%rdi), %ymm11
vpaddw 2752(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1320(%rdi)
mov %r8, %rsp
pop %r12


+ 1
- 4
crypto_kem/ntruhrss701/clean/owcpa.h View File

@@ -4,12 +4,9 @@
#include "params.h"
#include "poly.h"

void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES],
const unsigned char seed[NTRU_SEEDBYTES]);

void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk,
const unsigned char seed[NTRU_SEEDBYTES]);
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]);

void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_enc(unsigned char *c,
const poly *r,


+ 8
- 0
crypto_kem/ntruhrss701/clean/poly.c View File

@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHRSS701_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly *b
}

void PQCLEAN_NTRUHRSS701_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) {
int i;

/* Our S3 multiplications do not overflow mod q, */
/* so we can re-purpose PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul, as long as we */
/* follow with an explicit reduction mod q. */
PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul(r, a, b);
for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = MODQ(r->coeffs[i]);
}
PQCLEAN_NTRUHRSS701_CLEAN_poly_mod_3_Phi_n(r);
}



+ 277
- 8
crypto_kem/ntruhrss701/clean/poly_rq_mul.c View File

@@ -1,15 +1,284 @@
#include "poly.h"

/* Polynomial multiplication using */
/* Toom-4 and two layers of Karatsuba. */

#define L PAD32(NTRU_N)
#define M (L/4)
#define K (L/16)

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);

static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]);
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]);
static inline void k2x2_eval(uint16_t r[9 * K]);

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]);
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]);

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]);
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]);

void PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) {
int k, i;
size_t i;
uint16_t ab[2 * L];

for (k = 0; k < NTRU_N; k++) {
r->coeffs[k] = 0;
for (i = 1; i < NTRU_N - k; i++) {
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
}
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i];
for (i = 0; i < NTRU_N; i++) {
ab[i] = a->coeffs[i];
ab[L + i] = b->coeffs[i];
}
for (i = NTRU_N; i < L; i++) {
ab[i] = 0;
ab[L + i] = 0;
}

toom4_k2x2_mul(ab, ab, ab + L);

for (i = 0; i < NTRU_N; i++) {
r->coeffs[i] = ab[i] + ab[NTRU_N + i];
}
}

static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) {
uint16_t tmpA[9 * K];
uint16_t tmpB[9 * K];
uint16_t eC[63 * 2 * K];

toom4_k2x2_eval_0(tmpA, a);
toom4_k2x2_eval_0(tmpB, b);
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p1(tmpA, a);
toom4_k2x2_eval_p1(tmpB, b);
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m1(tmpA, a);
toom4_k2x2_eval_m1(tmpB, b);
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p2(tmpA, a);
toom4_k2x2_eval_p2(tmpB, b);
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_m2(tmpA, a);
toom4_k2x2_eval_m2(tmpB, b);
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_p3(tmpA, a);
toom4_k2x2_eval_p3(tmpB, b);
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_eval_inf(tmpA, a);
toom4_k2x2_eval_inf(tmpB, b);
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB);

toom4_k2x2_interpolate(ab, eC);
}


static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += a[1 * M + i];
r[i] += a[2 * M + i];
r[i] += a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= a[1 * M + i];
r[i] += a[2 * M + i];
r[i] -= a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] += 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] -= 2 * a[1 * M + i];
r[i] += 4 * a[2 * M + i];
r[i] -= 8 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[0 * M + i];
r[i] += 3 * a[1 * M + i];
r[i] += 9 * a[2 * M + i];
r[i] += 27 * a[3 * M + i];
}
k2x2_eval(r);
}

static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) {
for (size_t i = 0; i < M; i++) {
r[i] = a[3 * M + i];
}
k2x2_eval(r);
}

static inline void k2x2_eval(uint16_t r[9 * K]) {
/* Input: e + f.Y + g.Y^2 + h.Y^3 */
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */

size_t i;
for (i = 0; i < 4 * K; i++) {
r[4 * K + i] = r[i];
}
for (i = 0; i < K; i++) {
r[4 * K + i] += r[1 * K + i];
r[5 * K + i] += r[3 * K + i];
r[6 * K + i] += r[0 * K + i];
r[7 * K + i] += r[2 * K + i];
r[8 * K + i] = r[5 * K + i];
r[8 * K + i] += r[6 * K + i];
}
}

static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) {
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K);
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K);
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K);
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K);
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K);
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K);
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K);
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K);
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K);
}

static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) {
size_t i, j;
for (j = 0; j < K; j++) {
r[j] = a[0] * b[j];
}
for (i = 1; i < K; i++) {
for (j = 0; j < K - 1; j++) {
r[i + j] += a[i] * b[j];
}
r[i + K - 1] = a[i] * b[K - 1];
}
r[2 * K - 1] = 0;
}

static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) {
size_t i;

uint16_t P1[2 * M];
uint16_t Pm1[2 * M];
uint16_t P2[2 * M];
uint16_t Pm2[2 * M];

uint16_t *C0 = r;
uint16_t *C2 = r + 2 * M;
uint16_t *C4 = r + 4 * M;
uint16_t *C6 = r + 6 * M;

uint16_t V0, V1, V2;

k2x2_interpolate(C0, a + 0 * 9 * 2 * K);
k2x2_interpolate(P1, a + 1 * 9 * 2 * K);
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K);
k2x2_interpolate(P2, a + 3 * 9 * 2 * K);
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K);
k2x2_interpolate(C6, a + 6 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1;
V0 = V0 - C0[i] - C6[i];
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3;
C4[i] = 43691 * (V1 - V0);
C2[i] = V0 - C4[i];
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1;
}

/* reuse Pm1 for P3 */
#define P3 Pm1
k2x2_interpolate(P3, a + 5 * 9 * 2 * K);

for (i = 0; i < 2 * M; i++) {
V0 = P1[i];
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0);
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i])));
V2 = ((uint32_t)(V2 - V0)) >> 3;
V2 -= V1;
P3[i] = 52429 * V2;
P2[i] = V1 - V2;
P1[i] = V0 - P2[i] - P3[i];
}

for (i = 0; i < 2 * M; i++) {
r[1 * M + i] += P1[i];
r[3 * M + i] += P2[i];
r[5 * M + i] += P3[i];
}
}

static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) {
size_t i;
uint16_t tmp[4 * K];

for (i = 0; i < 2 * K; i++) {
r[0 * K + i] = a[0 * K + i];
r[2 * K + i] = a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[4 * K + i] = a[4 * K + i];
r[6 * K + i] = a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[0 * K + i] = a[12 * K + i];
tmp[2 * K + i] = a[10 * K + i];
}

for (i = 0; i < 2 * K; i++) {
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i];
}

for (i = 0; i < 4 * K; i++) {
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i];
}

for (i = 0; i < 4 * K; i++) {
r[2 * K + i] += tmp[0 * K + i];
}
}


Loading…
Cancel
Save