/* * TEE_BigIntMulMod */ void TEE_BigIntMulMod(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2, const TEE_BigInt *n) { mpanum mpa_dest = (mpa_num_base *)dest; mpanum mpa_op1 = (mpa_num_base *)op1; mpanum mpa_op2 = (mpa_num_base *)op2; mpanum mpa_n = (mpa_num_base *)n; mpanum tmp_dest; if (TEE_BigIntCmpS32(n, 2) < 0) TEE_BigInt_Panic("Modulus is too short"); /* * From the spec, mpa_dest must be of magnitude "mpa_n" * But internal computations in mpa do not have such assumptions * (as __mpa_div_q_r, where "r" must be of magnitude "op1", * whereas GP provides a magnitude of "op2") * This is a tempory variable is used, before storing the * final result. */ mpa_alloc_static_temp_var(&tmp_dest, mempool); mpa_mul_mod(tmp_dest, mpa_op1, mpa_op2, mpa_n, mempool); if (mpa_cmp_short(tmp_dest, 0) < 0) mpa_add(tmp_dest, tmp_dest, mpa_n, mempool); mpa_copy(mpa_dest, tmp_dest); mpa_free_static_temp_var(&tmp_dest, mempool); }
static int mulmod(void *a, void *b, void *c, void *d) { LTC_ARGCHK(a != NULL); LTC_ARGCHK(b != NULL); LTC_ARGCHK(c != NULL); LTC_ARGCHK(d != NULL); void *tmpa, *tmpb; mp_init_multi(&tmpa, &tmpb, NULL); mod(a, c, tmpa); mod(b, c, tmpb); mpa_mul_mod((mpanum) d, (const mpanum) tmpa, (const mpanum) tmpb, (const mpanum) c, external_mem_pool); mp_clear_multi(tmpa, tmpb, NULL); return CRYPT_OK; }