void TEE_BigIntInit(TEE_BigInt *bigInt, uint32_t len) { memset(bigInt, 0, TEE_BigIntSizeInU32(len) * sizeof(uint32_t)); struct bigint_hdr *hdr = (struct bigint_hdr *)bigInt; hdr->sign = 1; if ((len - BIGINT_HDR_SIZE_IN_U32) > MBEDTLS_MPI_MAX_LIMBS) API_PANIC("Too large bigint"); hdr->alloc_size = len - BIGINT_HDR_SIZE_IN_U32; }
void TEE_BigIntMul(TEE_BigInt *dest, const TEE_BigInt *op1, const TEE_BigInt *op2) { size_t bs1 = TEE_BigIntGetBitCount(op1); size_t bs2 = TEE_BigIntGetBitCount(op2); size_t s = TEE_BigIntSizeInU32(bs1) + TEE_BigIntSizeInU32(bs2); TEE_BigInt zero[TEE_BigIntSizeInU32(1)] = { 0 }; TEE_BigInt *tmp = NULL; tmp = mempool_alloc(mbedtls_mpi_mempool, sizeof(uint32_t) * s); if (!tmp) TEE_Panic(TEE_ERROR_OUT_OF_MEMORY); TEE_BigIntInit(tmp, s); TEE_BigIntInit(zero, TEE_BigIntSizeInU32(1)); bigint_binary(tmp, op1, op2, mbedtls_mpi_mul_mpi); TEE_BigIntAdd(dest, tmp, zero); mempool_free(mbedtls_mpi_mempool, tmp); }
/*------------------------------------------------------------ * * test_BigIntInit * */ static void test_BigIntInit(void) { TEE_BigInt *a; size_t aLen; TB_INFO("Testing BigIntInit"); /* Testing normal allocation and initialization */ aLen = TEE_BigIntSizeInU32(512); a = (TEE_BigInt *) TEE_Malloc(aLen * sizeof(TEE_BigInt), 0); TEE_BigIntInit(a, aLen); TEE_Free(a); /* Testing zero allocation */ aLen = TEE_BigIntSizeInU32(0); a = (TEE_BigInt *) TEE_Malloc(aLen * sizeof(TEE_BigInt), 0); TEE_BigIntInit(a, aLen); TEE_Free(a); /* Testing too large */ aLen = TEE_BigIntSizeInU32(4096); a = (TEE_BigInt *) TEE_Malloc(aLen * sizeof(TEE_BigInt), 0); TEE_BigIntInit(a, aLen); TEE_Free(a); /* Testing boundaries */ aLen = TEE_BigIntSizeInU32(2048); a = (TEE_BigInt *) TEE_Malloc(aLen * sizeof(TEE_BigInt), 0); TEE_BigIntInit(a, aLen); TEE_Free(a); aLen = TEE_BigIntSizeInU32(2049); a = (TEE_BigInt *) TEE_Malloc(aLen * sizeof(TEE_BigInt), 0); TEE_BigIntInit(a, aLen); TEE_Free(a); }
/* * TEE_BigIntFMMSizeInU32 */ uint32_t TEE_BigIntFMMSizeInU32(uint32_t modulusSizeInBits) { return TEE_BigIntSizeInU32(modulusSizeInBits) + 1; }