/* get normalization value */ static int montgomery_normalization(void *a, void *b) { LTC_ARGCHK(a != NULL); LTC_ARGCHK(b != NULL); mpa_asize_t s; s = __mpanum_size((mpanum) b); twoexpt(a, s * MPA_WORD_SIZE); mpa_mod((mpanum) a, (const mpanum) a, (const mpanum) b, external_mem_pool); return CRYPT_OK; }
static int mod(void *a, void *b, void *c) { LTC_ARGCHK(a != NULL); LTC_ARGCHK(b != NULL); LTC_ARGCHK(c != NULL); mpa_mod((mpanum) c, (const mpanum) a, (const mpanum) b, external_mem_pool); if (mpa_cmp_short(c, 0) < 0) { mpa_add(c, c, b, external_mem_pool); } return CRYPT_OK; }
/* * TEE_BigIntMod */ void TEE_BigIntMod(TEE_BigInt *dest, const TEE_BigInt *op, const TEE_BigInt *n) { mpanum mpa_dest = (mpa_num_base *)dest; mpanum mpa_op = (mpa_num_base *)op; mpanum mpa_n = (mpa_num_base *)n; if (TEE_BigIntCmpS32(n, 2) < 0) TEE_BigInt_Panic("Modulus is too short"); mpa_mod(mpa_dest, mpa_op, mpa_n, mempool); if (mpa_cmp_short(mpa_dest, 0) < 0) mpa_add(mpa_dest, mpa_dest, mpa_n, mempool); }
/* reduce */ static int montgomery_reduce(void *a, void *b, void *c) { LTC_ARGCHK(a != NULL); LTC_ARGCHK(b != NULL); LTC_ARGCHK(c != NULL); mpanum tmp; init((void **)&tmp); // WARNING // Workaround for a bug when a > b (a greater than the modulus) if (compare(a, b) == LTC_MP_GT) { mpa_mod((mpanum) a, (const mpanum) a, (const mpanum) b, external_mem_pool); } mpa_montgomery_mul(tmp, (mpanum) a, mpa_constant_one(), (mpanum) b, ((mpa_fmm_context) c)->n_inv, external_mem_pool); mpa_copy(a, tmp); deinit(tmp); return CRYPT_OK; }