/* * This file is dual licensed * under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0.html) * or public domain at https://github.com/pq-crystals/dilithium */ #include "params.h" #include "reduce.h" #include /************************************************* * Name: montgomery_reduce * * Description: For finite field element a with -2^{31}Q <= a <= Q*2^31, * compute r \equiv a*2^{-32} (mod Q) such that -Q < r < Q. * * Arguments: - int64_t: finite field element a * * Returns r. **************************************************/ int32_t montgomery_reduce(int64_t a) { int32_t t; t = (int32_t)((uint64_t)a * (uint64_t)DILITHIUM_QINV); t = (a - (int64_t)t * DILITHIUM_Q) >> 32; return t; } /************************************************* * Name: reduce32 * * Description: For finite field element a with a <= 2^{31} - 2^{22} - 1, * compute r \equiv a (mod Q) such that -6283009 <= r <= 6283007. * * Arguments: - int32_t: finite field element a * * Returns r. **************************************************/ int32_t reduce32(int32_t a) { int32_t t; t = (a + (1 << 22)) >> 23; t = a - t * DILITHIUM_Q; return t; } /************************************************* * Name: caddq * * Description: Add Q if input coefficient is negative. * * Arguments: - int32_t: finite field element a * * Returns r. **************************************************/ int32_t caddq(int32_t a) { a += (a >> 31) & DILITHIUM_Q; return a; } /************************************************* * Name: freeze * * Description: For finite field element a, compute standard * representative r = a mod^+ Q. * * Arguments: - int32_t: finite field element a * * Returns r. **************************************************/ int32_t freeze(int32_t a) { a = reduce32(a); a = caddq(a); return a; }