/* * Copyright 2019–present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Runtime.InteropServices; namespace MongoDB.Libmongocrypt { /// /// The low-level interface to libmongocrypt. /// public class Library { static Library() { _mongocrypt_version = new Lazy( () => __loader.Value.GetFunction("mongocrypt_version"), true); _mongocrypt_new = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_new")), true); _mongocrypt_setopt_log_handler = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_log_handler")), true); _mongocrypt_init = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_init")), true); _mongocrypt_destroy = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_destroy")), true); _mongocrypt_status = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status")), true); _mongocrypt_setopt_kms_providers = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_kms_providers")), true); _mongocrypt_ctx_setopt_key_encryption_key = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_key_encryption_key")), true); _mongocrypt_setopt_aes_256_ecb = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_aes_256_ecb")), true); _mongocrypt_setopt_bypass_query_analysis = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_bypass_query_analysis")), true); _mongocrypt_setopt_crypto_hooks = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_crypto_hooks")), true); _mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5 = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5")), true); _mongocrypt_setopt_encrypted_field_config_map = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_encrypted_field_config_map")), true); _mongocrypt_setopt_schema_map = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_setopt_schema_map")), true); _mongocrypt_setopt_append_crypt_shared_lib_search_path = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_setopt_append_crypt_shared_lib_search_path")), true); _mongocrypt_setopt_set_crypt_shared_lib_path_override = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_setopt_set_crypt_shared_lib_path_override")), true); _mongocrypt_setopt_use_need_kms_credentials_state = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_setopt_use_need_kms_credentials_state")), true); _mongocrypt_crypt_shared_lib_version_string = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_crypt_shared_lib_version_string")), true); _mongocrypt_crypt_shared_lib_version = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_crypt_shared_lib_version")), true); _mongocrypt_status_new = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_new")), true); _mongocrypt_status_destroy = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_destroy")), true); _mongocrypt_status_type = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_type")), true); _mongocrypt_status_code = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_code")), true); _mongocrypt_status_message = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_message")), true); _mongocrypt_status_ok = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_ok")), true); _mongocrypt_status_set = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_status_set")), true); _mongocrypt_binary_new = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_binary_new")), true); _mongocrypt_binary_destroy = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_binary_destroy")), true); _mongocrypt_binary_new_from_data = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_binary_new_from_data")), true); _mongocrypt_binary_data = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_binary_data")), true); _mongocrypt_binary_len = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_binary_len")), true); _mongocrypt_ctx_new = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_new")), true); _mongocrypt_ctx_setopt_key_material = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_key_material")), true); _mongocrypt_ctx_setopt_masterkey_aws = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_masterkey_aws")), true); _mongocrypt_ctx_setopt_masterkey_aws_endpoint = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_masterkey_aws_endpoint")), true); _mongocrypt_ctx_setopt_masterkey_local = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_masterkey_local")), true); _mongocrypt_ctx_setopt_key_alt_name = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_key_alt_name")), true); _mongocrypt_ctx_setopt_key_id = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_key_id")), true); _mongocrypt_ctx_setopt_algorithm = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_algorithm")), true); _mongocrypt_ctx_setopt_contention_factor = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_contention_factor")), true); _mongocrypt_ctx_setopt_query_type = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_setopt_query_type")), true); _mongocrypt_ctx_status = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_status")), true); _mongocrypt_ctx_encrypt_init = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_ctx_encrypt_init")), true); _mongocrypt_ctx_decrypt_init = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_ctx_decrypt_init")), true); _mongocrypt_ctx_explicit_encrypt_init = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_explicit_encrypt_init")), true); _mongocrypt_ctx_explicit_decrypt_init = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_ctx_explicit_decrypt_init")), true); _mongocrypt_ctx_datakey_init = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_ctx_datakey_init")), true); _mongocrypt_ctx_provide_kms_providers = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_provide_kms_providers")), true); _mongocrypt_ctx_state = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_state")), true); _mongocrypt_ctx_mongo_op = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_mongo_op")), true); _mongocrypt_ctx_mongo_feed = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_mongo_feed")), true); _mongocrypt_ctx_mongo_done = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_mongo_done")), true); _mongocrypt_ctx_next_kms_ctx = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_ctx_next_kms_ctx")), true); _mongocrypt_ctx_rewrap_many_datakey_init = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_ctx_rewrap_many_datakey_init")), true); _mongocrypt_kms_ctx_endpoint = new Lazy( () => __loader.Value .GetFunction(("mongocrypt_kms_ctx_endpoint")), true); _mongocrypt_kms_ctx_message = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_kms_ctx_message")), true); _mongocrypt_kms_ctx_bytes_needed = new Lazy( () => __loader.Value.GetFunction( ("mongocrypt_kms_ctx_bytes_needed")), true); _mongocrypt_kms_ctx_feed = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_kms_ctx_feed")), true); _mongocrypt_kms_ctx_status = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_kms_ctx_status")), true); _mongocrypt_ctx_kms_done = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_kms_done")), true); _mongocrypt_ctx_finalize = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_finalize")), true); _mongocrypt_ctx_destroy = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_ctx_destroy")), true); _mongocrypt_kms_ctx_get_kms_provider = new Lazy( () => __loader.Value.GetFunction(("mongocrypt_kms_ctx_get_kms_provider")), true); } /// /// Gets the version of libmongocrypt. /// /// /// The version. /// public static string Version { get { uint length; IntPtr p = mongocrypt_version(out length); return Marshal.PtrToStringAnsi(p); } } internal static Delegates.mongocrypt_version mongocrypt_version => _mongocrypt_version.Value; internal static Delegates.mongocrypt_new mongocrypt_new => _mongocrypt_new.Value; internal static Delegates.mongocrypt_setopt_log_handler mongocrypt_setopt_log_handler => _mongocrypt_setopt_log_handler.Value; internal static Delegates.mongocrypt_setopt_kms_providers mongocrypt_setopt_kms_providers => _mongocrypt_setopt_kms_providers.Value; internal static Delegates.mongocrypt_ctx_setopt_key_encryption_key mongocrypt_ctx_setopt_key_encryption_key => _mongocrypt_ctx_setopt_key_encryption_key.Value; internal static Delegates.mongocrypt_setopt_aes_256_ecb mongocrypt_setopt_aes_256_ecb => _mongocrypt_setopt_aes_256_ecb.Value; internal static Delegates.mongocrypt_setopt_bypass_query_analysis mongocrypt_setopt_bypass_query_analysis => _mongocrypt_setopt_bypass_query_analysis.Value; internal static Delegates.mongocrypt_setopt_crypto_hooks mongocrypt_setopt_crypto_hooks => _mongocrypt_setopt_crypto_hooks.Value; internal static Delegates.mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5 mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5 => _mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5.Value; internal static Delegates.mongocrypt_setopt_encrypted_field_config_map mongocrypt_setopt_encrypted_field_config_map => _mongocrypt_setopt_encrypted_field_config_map.Value; internal static Delegates.mongocrypt_setopt_schema_map mongocrypt_setopt_schema_map => _mongocrypt_setopt_schema_map.Value; internal static Delegates.mongocrypt_setopt_append_crypt_shared_lib_search_path mongocrypt_setopt_append_crypt_shared_lib_search_path => _mongocrypt_setopt_append_crypt_shared_lib_search_path.Value; internal static Delegates.mongocrypt_setopt_set_crypt_shared_lib_path_override mongocrypt_setopt_set_crypt_shared_lib_path_override => _mongocrypt_setopt_set_crypt_shared_lib_path_override.Value; internal static Delegates.mongocrypt_setopt_use_need_kms_credentials_state mongocrypt_setopt_use_need_kms_credentials_state => _mongocrypt_setopt_use_need_kms_credentials_state.Value; internal static Delegates.mongocrypt_crypt_shared_lib_version_string mongocrypt_crypt_shared_lib_version_string => _mongocrypt_crypt_shared_lib_version_string.Value; internal static Delegates.mongocrypt_crypt_shared_lib_version mongocrypt_crypt_shared_lib_version => _mongocrypt_crypt_shared_lib_version.Value; internal static Delegates.mongocrypt_init mongocrypt_init => _mongocrypt_init.Value; internal static Delegates.mongocrypt_destroy mongocrypt_destroy => _mongocrypt_destroy.Value; internal static Delegates.mongocrypt_status mongocrypt_status => _mongocrypt_status.Value; internal static Delegates.mongocrypt_status_new mongocrypt_status_new => _mongocrypt_status_new.Value; internal static Delegates.mongocrypt_status_destroy mongocrypt_status_destroy => _mongocrypt_status_destroy.Value; internal static Delegates.mongocrypt_status_type mongocrypt_status_type => _mongocrypt_status_type.Value; internal static Delegates.mongocrypt_status_code mongocrypt_status_code => _mongocrypt_status_code.Value; internal static Delegates.mongocrypt_status_message mongocrypt_status_message => _mongocrypt_status_message.Value; internal static Delegates.mongocrypt_status_ok mongocrypt_status_ok => _mongocrypt_status_ok.Value; internal static Delegates.mongocrypt_status_set mongocrypt_status_set => _mongocrypt_status_set.Value; internal static Delegates.mongocrypt_binary_new mongocrypt_binary_new => _mongocrypt_binary_new.Value; internal static Delegates.mongocrypt_binary_destroy mongocrypt_binary_destroy => _mongocrypt_binary_destroy.Value; internal static Delegates.mongocrypt_binary_new_from_data mongocrypt_binary_new_from_data => _mongocrypt_binary_new_from_data.Value; internal static Delegates.mongocrypt_binary_data mongocrypt_binary_data => _mongocrypt_binary_data.Value; internal static Delegates.mongocrypt_binary_len mongocrypt_binary_len => _mongocrypt_binary_len.Value; internal static Delegates.mongocrypt_ctx_new mongocrypt_ctx_new => _mongocrypt_ctx_new.Value; internal static Delegates.mongocrypt_ctx_setopt_key_material mongocrypt_ctx_setopt_key_material => _mongocrypt_ctx_setopt_key_material.Value; internal static Delegates.mongocrypt_ctx_setopt_masterkey_aws mongocrypt_ctx_setopt_masterkey_aws => _mongocrypt_ctx_setopt_masterkey_aws.Value; internal static Delegates.mongocrypt_ctx_setopt_masterkey_aws_endpoint mongocrypt_ctx_setopt_masterkey_aws_endpoint => _mongocrypt_ctx_setopt_masterkey_aws_endpoint.Value; internal static Delegates.mongocrypt_ctx_status mongocrypt_ctx_status => _mongocrypt_ctx_status.Value; internal static Delegates.mongocrypt_ctx_encrypt_init mongocrypt_ctx_encrypt_init => _mongocrypt_ctx_encrypt_init.Value; internal static Delegates.mongocrypt_ctx_decrypt_init mongocrypt_ctx_decrypt_init => _mongocrypt_ctx_decrypt_init.Value; internal static Delegates.mongocrypt_ctx_explicit_encrypt_init mongocrypt_ctx_explicit_encrypt_init => _mongocrypt_ctx_explicit_encrypt_init.Value; internal static Delegates.mongocrypt_ctx_explicit_decrypt_init mongocrypt_ctx_explicit_decrypt_init => _mongocrypt_ctx_explicit_decrypt_init.Value; internal static Delegates.mongocrypt_ctx_datakey_init mongocrypt_ctx_datakey_init => _mongocrypt_ctx_datakey_init.Value; internal static Delegates.mongocrypt_ctx_provide_kms_providers mongocrypt_ctx_provide_kms_providers => _mongocrypt_ctx_provide_kms_providers.Value; internal static Delegates.mongocrypt_ctx_setopt_masterkey_local mongocrypt_ctx_setopt_masterkey_local => _mongocrypt_ctx_setopt_masterkey_local.Value; internal static Delegates.mongocrypt_ctx_setopt_key_id mongocrypt_ctx_setopt_key_id => _mongocrypt_ctx_setopt_key_id.Value; internal static Delegates.mongocrypt_ctx_setopt_key_alt_name mongocrypt_ctx_setopt_key_alt_name => _mongocrypt_ctx_setopt_key_alt_name.Value; internal static Delegates.mongocrypt_ctx_setopt_algorithm mongocrypt_ctx_setopt_algorithm => _mongocrypt_ctx_setopt_algorithm.Value; internal static Delegates.mongocrypt_ctx_setopt_contention_factor mongocrypt_ctx_setopt_contention_factor => _mongocrypt_ctx_setopt_contention_factor.Value; internal static Delegates.mongocrypt_ctx_setopt_query_type mongocrypt_ctx_setopt_query_type => _mongocrypt_ctx_setopt_query_type.Value; internal static Delegates.mongocrypt_ctx_state mongocrypt_ctx_state => _mongocrypt_ctx_state.Value; internal static Delegates.mongocrypt_ctx_mongo_op mongocrypt_ctx_mongo_op => _mongocrypt_ctx_mongo_op.Value; internal static Delegates.mongocrypt_ctx_mongo_feed mongocrypt_ctx_mongo_feed => _mongocrypt_ctx_mongo_feed.Value; internal static Delegates.mongocrypt_ctx_mongo_done mongocrypt_ctx_mongo_done => _mongocrypt_ctx_mongo_done.Value; internal static Delegates.mongocrypt_ctx_next_kms_ctx mongocrypt_ctx_next_kms_ctx => _mongocrypt_ctx_next_kms_ctx.Value; internal static Delegates.mongocrypt_ctx_rewrap_many_datakey_init mongocrypt_ctx_rewrap_many_datakey_init => _mongocrypt_ctx_rewrap_many_datakey_init.Value; internal static Delegates.mongocrypt_kms_ctx_endpoint mongocrypt_kms_ctx_endpoint => _mongocrypt_kms_ctx_endpoint.Value; internal static Delegates.mongocrypt_kms_ctx_message mongocrypt_kms_ctx_message => _mongocrypt_kms_ctx_message.Value; internal static Delegates.mongocrypt_kms_ctx_bytes_needed mongocrypt_kms_ctx_bytes_needed => _mongocrypt_kms_ctx_bytes_needed.Value; internal static Delegates.mongocrypt_kms_ctx_feed mongocrypt_kms_ctx_feed => _mongocrypt_kms_ctx_feed.Value; internal static Delegates.mongocrypt_kms_ctx_status mongocrypt_kms_ctx_status => _mongocrypt_kms_ctx_status.Value; internal static Delegates.mongocrypt_ctx_kms_done mongocrypt_ctx_kms_done => _mongocrypt_ctx_kms_done.Value; internal static Delegates.mongocrypt_ctx_finalize mongocrypt_ctx_finalize => _mongocrypt_ctx_finalize.Value; internal static Delegates.mongocrypt_ctx_destroy mongocrypt_ctx_destroy => _mongocrypt_ctx_destroy.Value; internal static Delegates.mongocrypt_kms_ctx_get_kms_provider mongocrypt_kms_ctx_get_kms_provider => _mongocrypt_kms_ctx_get_kms_provider.Value; private static readonly Lazy __loader = new Lazy( () => new LibraryLoader(), true); private static readonly Lazy _mongocrypt_version; private static readonly Lazy _mongocrypt_new; private static readonly Lazy _mongocrypt_setopt_log_handler; private static readonly Lazy _mongocrypt_setopt_kms_providers; private static readonly Lazy _mongocrypt_ctx_setopt_key_encryption_key; private static readonly Lazy _mongocrypt_setopt_aes_256_ecb; private static readonly Lazy _mongocrypt_setopt_bypass_query_analysis; private static readonly Lazy _mongocrypt_setopt_crypto_hooks; private static readonly Lazy _mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5; private static readonly Lazy _mongocrypt_setopt_encrypted_field_config_map; private static readonly Lazy _mongocrypt_setopt_schema_map; private static readonly Lazy _mongocrypt_setopt_append_crypt_shared_lib_search_path; private static readonly Lazy _mongocrypt_setopt_set_crypt_shared_lib_path_override; private static readonly Lazy _mongocrypt_setopt_use_need_kms_credentials_state; private static readonly Lazy _mongocrypt_crypt_shared_lib_version_string; private static readonly Lazy _mongocrypt_crypt_shared_lib_version; private static readonly Lazy _mongocrypt_init; private static readonly Lazy _mongocrypt_destroy; private static readonly Lazy _mongocrypt_status; private static readonly Lazy _mongocrypt_status_new; private static readonly Lazy _mongocrypt_status_destroy; private static readonly Lazy _mongocrypt_status_type; private static readonly Lazy _mongocrypt_status_code; private static readonly Lazy _mongocrypt_status_message; private static readonly Lazy _mongocrypt_status_ok; private static readonly Lazy _mongocrypt_status_set; private static readonly Lazy _mongocrypt_binary_new; private static readonly Lazy _mongocrypt_binary_destroy; private static readonly Lazy _mongocrypt_binary_new_from_data; private static readonly Lazy _mongocrypt_binary_data; private static readonly Lazy _mongocrypt_binary_len; private static readonly Lazy _mongocrypt_ctx_new; private static readonly Lazy _mongocrypt_ctx_setopt_key_material; private static readonly Lazy _mongocrypt_ctx_setopt_masterkey_aws; private static readonly Lazy _mongocrypt_ctx_setopt_masterkey_aws_endpoint; private static readonly Lazy _mongocrypt_ctx_status; private static readonly Lazy _mongocrypt_ctx_encrypt_init; private static readonly Lazy _mongocrypt_ctx_decrypt_init; private static readonly Lazy _mongocrypt_ctx_explicit_encrypt_init; private static readonly Lazy _mongocrypt_ctx_explicit_decrypt_init; private static readonly Lazy _mongocrypt_ctx_datakey_init; private static readonly Lazy _mongocrypt_ctx_provide_kms_providers; private static readonly Lazy _mongocrypt_ctx_setopt_masterkey_local; private static readonly Lazy _mongocrypt_ctx_setopt_key_id; private static readonly Lazy _mongocrypt_ctx_setopt_key_alt_name; private static readonly Lazy _mongocrypt_ctx_setopt_algorithm; private static readonly Lazy _mongocrypt_ctx_setopt_contention_factor; private static readonly Lazy _mongocrypt_ctx_setopt_query_type; private static readonly Lazy _mongocrypt_ctx_state; private static readonly Lazy _mongocrypt_ctx_mongo_op; private static readonly Lazy _mongocrypt_ctx_mongo_feed; private static readonly Lazy _mongocrypt_ctx_mongo_done; private static readonly Lazy _mongocrypt_ctx_next_kms_ctx; private static readonly Lazy _mongocrypt_ctx_rewrap_many_datakey_init; private static readonly Lazy _mongocrypt_kms_ctx_endpoint; private static readonly Lazy _mongocrypt_kms_ctx_message; private static readonly Lazy _mongocrypt_kms_ctx_bytes_needed; private static readonly Lazy _mongocrypt_kms_ctx_feed; private static readonly Lazy _mongocrypt_kms_ctx_status; private static readonly Lazy _mongocrypt_ctx_kms_done; private static readonly Lazy _mongocrypt_ctx_finalize; private static readonly Lazy _mongocrypt_ctx_destroy; private static readonly Lazy _mongocrypt_kms_ctx_get_kms_provider; // nested types internal enum StatusType { MONGOCRYPT_STATUS_OK = 0, MONGOCRYPT_STATUS_ERROR_CLIENT, MONGOCRYPT_STATUS_ERROR_KMS } internal class Delegates { // NOTE: Bool is expected to be 4 bytes during marshalling so we need to overwite it // https://blogs.msdn.microsoft.com/jaredpar/2008/10/14/pinvoke-and-bool-or-should-i-say-bool/ public delegate IntPtr mongocrypt_version(out uint length); public delegate MongoCryptSafeHandle mongocrypt_new(); public delegate void LogCallback([MarshalAs(UnmanagedType.I4)] LogLevel level, IntPtr messasge, uint message_length, IntPtr context); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_log_handler(MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.FunctionPtr)] LogCallback log_fn, IntPtr log_ctx); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_kms_providers( MongoCryptSafeHandle handle, BinarySafeHandle kms_providers); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_key_encryption_key( ContextSafeHandle handle, BinarySafeHandle bin); [return: MarshalAs(UnmanagedType.I1)] public delegate bool HashCallback( IntPtr ctx, IntPtr @in, IntPtr @out, IntPtr status); [return: MarshalAs(UnmanagedType.I1)] public delegate bool CryptoHmacCallback( IntPtr ctx, IntPtr key, IntPtr @in, IntPtr @out, IntPtr status); /// /// typedef bool (*mongocrypt_crypto_fn) ( /// void *ctx, // mongocrypt_binary_t* key, // mongocrypt_binary_t *iv, // mongocrypt_binary_t*in, // mongocrypt_binary_t*out, // uint32_t* bytes_written, // mongocrypt_status_t *status); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool CryptoCallback( IntPtr ctx, IntPtr key, IntPtr iv, IntPtr @in, IntPtr @out, ref uint bytes_written, IntPtr status); [return: MarshalAs(UnmanagedType.I1)] public delegate bool RandomCallback( IntPtr ctx, IntPtr @out, uint count, IntPtr statusPtr); /// /// bool mongocrypt_setopt_aes_256_ecb(mongocrypt_t* crypt, mongocrypt_crypto_fn aes_256_ecb_encrypt, void* ctx); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_aes_256_ecb( MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoCallback aes_256_ecb_encrypt, IntPtr ctx); /// /// void mongocrypt_setopt_bypass_query_analysis(mongocrypt_t* crypt); /// public delegate void mongocrypt_setopt_bypass_query_analysis(MongoCryptSafeHandle handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_crypto_hooks( MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoCallback aes_256_cbc_encrypt, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoCallback aes_256_cbc_decrypt, [MarshalAs(UnmanagedType.FunctionPtr)] RandomCallback random, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoHmacCallback hmac_sha_512, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoHmacCallback hmac_sha_256, [MarshalAs(UnmanagedType.FunctionPtr)] HashCallback mongocrypt_hash_fn, IntPtr ctx); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5( MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.FunctionPtr)] CryptoHmacCallback sign_rsaes_pkcs1_v1_5, IntPtr sign_ctx); /// /// bool mongocrypt_setopt_encrypted_field_config_map(mongocrypt_t* crypt, mongocrypt_binary_t* efc_map) /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_setopt_encrypted_field_config_map(MongoCryptSafeHandle handle, BinarySafeHandle efc_map); [return: MarshalAs(UnmanagedType.I1),] public delegate bool mongocrypt_setopt_schema_map(MongoCryptSafeHandle handle, BinarySafeHandle schema); /// /// void mongocrypt_setopt_append_crypt_shared_lib_search_path(mongocrypt_t* crypt, const char* path); /// public delegate void mongocrypt_setopt_append_crypt_shared_lib_search_path(MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.LPStr)] string path); /// /// void mongocrypt_setopt_set_crypt_shared_lib_path_override(mongocrypt_t* crypt, const char* path); /// public delegate void mongocrypt_setopt_set_crypt_shared_lib_path_override(MongoCryptSafeHandle handle, [MarshalAs(UnmanagedType.LPStr)] string path); /// /// void mongocrypt_setopt_use_need_kms_credentials_state(mongocrypt_t* crypt); /// /// public delegate void mongocrypt_setopt_use_need_kms_credentials_state(MongoCryptSafeHandle handle); /// /// const char * mongocrypt_crypt_shared_lib_version_string(const mongocrypt_t* crypt, uint32_t *len); /// public delegate IntPtr mongocrypt_crypt_shared_lib_version_string(MongoCryptSafeHandle handle, out uint length); /// /// uint64_t mongocrypt_crypt_shared_lib_version(const mongocrypt_t* crypt); /// public delegate ulong mongocrypt_crypt_shared_lib_version(MongoCryptSafeHandle handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_init(MongoCryptSafeHandle handle); public delegate void mongocrypt_destroy(IntPtr ptr); public delegate bool mongocrypt_status(MongoCryptSafeHandle handle, StatusSafeHandle ptr); public delegate StatusSafeHandle mongocrypt_status_new(); public delegate void mongocrypt_status_destroy(IntPtr ptr); public delegate StatusType mongocrypt_status_type(StatusSafeHandle ptr); public delegate uint mongocrypt_status_code(StatusSafeHandle ptr); public delegate IntPtr mongocrypt_status_message(StatusSafeHandle ptr, out uint length); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_status_ok(StatusSafeHandle ptr); // currently it does nothing due to MONGOCRYPT-257 public delegate void mongocrypt_status_set(StatusSafeHandle ptr, int type, uint code, IntPtr msg, int length); public delegate BinarySafeHandle mongocrypt_binary_new(); public delegate void mongocrypt_binary_destroy(IntPtr ptr); public delegate BinarySafeHandle mongocrypt_binary_new_from_data(IntPtr ptr, uint len); public delegate IntPtr mongocrypt_binary_data(BinarySafeHandle handle); public delegate uint mongocrypt_binary_len(BinarySafeHandle handle); public delegate ContextSafeHandle mongocrypt_ctx_new(MongoCryptSafeHandle handle); /// /// bool mongocrypt_ctx_setopt_key_material(mongocrypt_ctx_t* ctx, mongocrypt_binary_t* key_material) /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_key_material(ContextSafeHandle handle, BinarySafeHandle key_material); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_masterkey_aws(ContextSafeHandle handle, IntPtr region, int region_len, IntPtr cmk, int cmk_len); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_masterkey_aws_endpoint( ContextSafeHandle handle, IntPtr endpoint, int endpoint_len); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_status(ContextSafeHandle handle, StatusSafeHandle status); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_encrypt_init(ContextSafeHandle handle, IntPtr ns, int length, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_decrypt_init(ContextSafeHandle handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_explicit_encrypt_init(ContextSafeHandle handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_explicit_decrypt_init(ContextSafeHandle handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_datakey_init(ContextSafeHandle handle); /// /// bool mongocrypt_ctx_provide_kms_providers(mongocrypt_ctx_t* ctx, mongocrypt_binary_t* kms_providers_definition); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_provide_kms_providers(ContextSafeHandle handle, BinarySafeHandle kms_providers_definition); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_schema_map(ContextSafeHandle handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_masterkey_local(ContextSafeHandle handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_key_alt_name(ContextSafeHandle handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_key_id(ContextSafeHandle handle, BinarySafeHandle binary); /// /// bool mongocrypt_ctx_setopt_algorithm(mongocrypt_ctx_t* ctx, const char* algorithm, int len); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_algorithm(ContextSafeHandle handle, [MarshalAs(UnmanagedType.LPStr)] string algorithm, int length); /// /// bool mongocrypt_ctx_setopt_contention_factor(mongocrypt_ctx_t* ctx, int64_t contention_factor); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_contention_factor(ContextSafeHandle ctx, long contention_factor); /// /// bool mongocrypt_ctx_setopt_query_type(mongocrypt_ctx_t* ctx, const char* query_type, int len) /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_setopt_query_type(ContextSafeHandle ctx, [MarshalAs(UnmanagedType.LPStr)] string query_type, int length); public delegate CryptContext.StateCode mongocrypt_ctx_state(ContextSafeHandle handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_mongo_op(ContextSafeHandle handle, BinarySafeHandle bsonOp); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_mongo_feed(ContextSafeHandle handle, BinarySafeHandle reply); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_mongo_done(ContextSafeHandle handle); public delegate IntPtr mongocrypt_ctx_next_kms_ctx(ContextSafeHandle handle); /// /// bool mongocrypt_ctx_rewrap_many_datakey_init(mongocrypt_ctx_t* ctx, mongocrypt_binary_t* filter); /// [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_rewrap_many_datakey_init(ContextSafeHandle handle, BinarySafeHandle filter); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_kms_ctx_endpoint(IntPtr handle, ref IntPtr endpoint); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_kms_ctx_message(IntPtr handle, BinarySafeHandle binary); public delegate uint mongocrypt_kms_ctx_bytes_needed(IntPtr handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_kms_ctx_feed(IntPtr handle, BinarySafeHandle binary); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_kms_ctx_status(IntPtr handle, StatusSafeHandle status); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_kms_done(ContextSafeHandle handle); [return: MarshalAs(UnmanagedType.I1)] public delegate bool mongocrypt_ctx_finalize(ContextSafeHandle handle, BinarySafeHandle binary); public delegate void mongocrypt_ctx_destroy(IntPtr ptr); public delegate IntPtr mongocrypt_kms_ctx_get_kms_provider(IntPtr handle, out uint length); } } }