/* * 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); }
/* add */ static int add(void *a, void *b, void *c) { LTC_ARGCHK(a != NULL); LTC_ARGCHK(b != NULL); LTC_ARGCHK(c != NULL); mpa_add((mpanum) c, (const mpanum) a, (const mpanum) b, external_mem_pool); return CRYPT_OK; }
/* * TEE_BigIntAdd */ void TEE_BigIntAdd(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2) { mpanum mpa_dest = (mpa_num_base *)dest; mpanum mpa_op1 = (mpa_num_base *)op1; mpanum mpa_op2 = (mpa_num_base *)op2; mpa_add(mpa_dest, mpa_op1, mpa_op2, mempool); }
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; }
/*------------------------------------------------------------ * * mpa_add_mod * */ void mpa_add_mod(mpanum dest, const mpanum op1, const mpanum op2, const mpanum n, mpa_scratch_mem pool) { mpanum tmp_dest; mpa_alloc_static_temp_var(&tmp_dest, pool); mpa_add(tmp_dest, op1, op2, pool); mpa_div(NULL, dest, tmp_dest, n, pool); mpa_free_static_temp_var(&tmp_dest, pool); }
/* * TEE_BigIntSubMod */ void TEE_BigIntSubMod(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; if (TEE_BigIntCmpS32(n, 2) < 0) TEE_BigInt_Panic("Modulus is too short"); mpa_sub_mod(mpa_dest, mpa_op1, mpa_op2, mpa_n, mempool); if (mpa_cmp_short(mpa_dest, 0) < 0) mpa_add(mpa_dest, mpa_dest, mpa_n, mempool); }
/*------------------------------------------------------------ * * mpa_inv_mod * */ int mpa_inv_mod(mpanum dest, const mpanum op, const mpanum n, mpa_scratch_mem pool) { mpanum gcd; mpanum tmp_dest; int mem_marker; int res; if (mpa_cmp_short(op, 1) == 0) { mpa_set_S32(dest, 1); return 0; } mem_marker = (dest == op); if (mem_marker) mpa_alloc_static_temp_var(&tmp_dest, pool); else tmp_dest = dest; mpa_alloc_static_temp_var(&gcd, pool); /* The function mpa_extended_gcd behaves badly if tmp_dest = op */ mpa_extended_gcd(gcd, tmp_dest, NULL, op, n, pool); res = mpa_cmp_short(gcd, 1); if (mem_marker) { mpa_copy(dest, tmp_dest); mpa_free_static_temp_var(&tmp_dest, pool); } mpa_free_static_temp_var(&gcd, pool); if (res == 0) { while (mpa_cmp_short(dest, 0) < 0) mpa_add(dest, dest, n, pool); return 0; } else { return -1; } }