/* mpi-mod.c - Modular reduction * Copyright (C) 1998, 1999, 2001, 2002, 2003, * 2007 Free Software Foundation, Inc. * * This file is part of Libgcrypt. */ #include "mpi-internal.h" #include "longlong.h" /* Context used with Barrett reduction. */ struct barrett_ctx_s { … }; void mpi_mod(MPI rem, MPI dividend, MPI divisor) { … } /* This function returns a new context for Barrett based operations on * the modulus M. This context needs to be released using * _gcry_mpi_barrett_free. If COPY is true M will be transferred to * the context and the user may change M. If COPY is false, M may not * be changed until gcry_mpi_barrett_free has been called. */ mpi_barrett_t mpi_barrett_init(MPI m, int copy) { … } void mpi_barrett_free(mpi_barrett_t ctx) { … } /* R = X mod M * * Using Barrett reduction. Before using this function * _gcry_mpi_barrett_init must have been called to do the * precalculations. CTX is the context created by this precalculation * and also conveys M. If the Barret reduction could no be done a * straightforward reduction method is used. * * We assume that these conditions are met: * Input: x =(x_2k-1 ...x_0)_b * m =(m_k-1 ....m_0)_b with m_k-1 != 0 * Output: r = x mod m */ void mpi_mod_barrett(MPI r, MPI x, mpi_barrett_t ctx) { … } void mpi_mul_barrett(MPI w, MPI u, MPI v, mpi_barrett_t ctx) { … }