diff --git a/tfhe/c_api_tests/test_c_doc.c b/tfhe/c_api_tests/test_c_doc.c new file mode 100644 index 0000000000..5e7b42c09f --- /dev/null +++ b/tfhe/c_api_tests/test_c_doc.c @@ -0,0 +1,68 @@ +// If this test break the c_api doc needs to be updated + +#include + +#include +#include + +int main(void) +{ + int ok = 0; + // Prepare the config builder for the high level API and choose which types to enable + ConfigBuilder *builder; + Config *config; + + // Put the builder in a default state without any types enabled + config_builder_all_disabled(&builder); + // Enable the uint128 type using the small LWE key for encryption + config_builder_enable_default_integers_small(&builder); + // Populate the config + config_builder_build(builder, &config); + + ClientKey *client_key = NULL; + ServerKey *server_key = NULL; + + // Generate the keys using the config + generate_keys(config, &client_key, &server_key); + // Set the server key for the current thread + set_server_key(server_key); + + FheUint128 *lhs = NULL; + FheUint128 *rhs = NULL; + FheUint128 *result = NULL; + // A 128-bit unsigned integer containing value: 20 << 64 | 10 + U128 clear_lhs = { .w0 = 10, .w1 = 20 }; + // A 128-bit unsigned integer containing value: 2 << 64 | 1 + U128 clear_rhs = { .w0 = 1, .w1 = 2 }; + + ok = fhe_uint128_try_encrypt_with_client_key_u128(clear_lhs, client_key, &lhs); + assert(ok == 0); + + ok = fhe_uint128_try_encrypt_with_client_key_u128(clear_rhs, client_key, &rhs); + assert(ok == 0); + + // Compute the subtraction + ok = fhe_uint128_sub(lhs, rhs, &result); + assert(ok == 0); + + U128 clear_result; + // Decrypt + ok = fhe_uint128_decrypt(result, client_key, &clear_result); + assert(ok == 0); + + // Here the subtraction allows us to compare each word + assert(clear_result.w0 == 9); + assert(clear_result.w1 == 18); + + // Destroy the ciphertexts + fhe_uint128_destroy(lhs); + fhe_uint128_destroy(rhs); + fhe_uint128_destroy(result); + + // Destroy the keys + client_key_destroy(client_key); + server_key_destroy(server_key); + + printf("FHE computation successful!\n"); + return EXIT_SUCCESS; +}