1 module bindbc.gnutls.crypto; 2 3 import bindbc.gnutls.config; 4 import bindbc.gnutls.gnutls; 5 6 struct api_cipher_hd_st; 7 alias gnutls_cipher_hd_t = api_cipher_hd_st*; 8 9 struct api_aead_cipher_hd_st; 10 alias gnutls_aead_cipher_hd_t = api_aead_cipher_hd_st*; 11 12 struct hash_hd_st; 13 alias gnutls_hash_hd_t = hash_hd_st*; 14 15 struct hmac_hd_st; 16 alias gnutls_hmac_hd_t = hmac_hd_st*; 17 18 enum gnutls_rnd_level 19 { 20 GNUTLS_RND_NONCE = 0, 21 GNUTLS_RND_RANDOM = 1, 22 GNUTLS_RND_KEY = 2 23 } 24 25 alias gnutls_rnd_level_t = gnutls_rnd_level; 26 27 extern(C) nothrow @nogc 28 { 29 alias gnutls_cipher_init_func = int function (gnutls_cipher_algorithm_t, void** ctx, int enc); 30 alias gnutls_cipher_setkey_func = int function (void* ctx, const(void)* key, size_t keysize); 31 alias gnutls_cipher_setiv_func = int function (void* ctx, const(void)* iv, size_t ivsize); 32 alias gnutls_cipher_getiv_func = int function (void* ctx, void* iv, size_t ivsize); 33 alias gnutls_cipher_encrypt_func = int function (void* ctx, const(void)* plain, size_t plainsize, void* encr, size_t encrsize); 34 alias gnutls_cipher_decrypt_func = int function (void* ctx, const(void)* encr, size_t encrsize, void* plain, size_t plainsize); 35 alias gnutls_cipher_auth_func = int function (void* ctx, const(void)* data, size_t datasize); 36 alias gnutls_cipher_tag_func = void function (void* ctx, void* tag, size_t tagsize); 37 alias gnutls_cipher_aead_encrypt_func = int function (void* ctx, const(void)* nonce, size_t noncesize, const(void)* auth, size_t authsize, size_t tag_size, const(void)* plain, size_t plainsize, void* encr, size_t encrsize); 38 alias gnutls_cipher_aead_decrypt_func = int function (void* ctx, const(void)* nonce, size_t noncesize, const(void)* auth, size_t authsize, size_t tag_size, const(void)* encr, size_t encrsize, void* plain, size_t plainsize); 39 alias gnutls_cipher_deinit_func = void function (void* ctx); 40 alias gnutls_mac_init_func = int function (gnutls_mac_algorithm_t, void** ctx); 41 alias gnutls_mac_setkey_func = int function (void* ctx, const(void)* key, size_t keysize); 42 alias gnutls_mac_setnonce_func = int function (void* ctx, const(void)* nonce, size_t noncesize); 43 alias gnutls_mac_hash_func = int function (void* ctx, const(void)* text, size_t textsize); 44 alias gnutls_mac_output_func = int function (void* src_ctx, void* digest, size_t digestsize); 45 alias gnutls_mac_deinit_func = void function (void* ctx); 46 alias gnutls_mac_fast_func = int function (gnutls_mac_algorithm_t, const(void)* nonce, size_t nonce_size, const(void)* key, size_t keysize, const(void)* text, size_t textsize, void* digest); 47 alias gnutls_mac_copy_func = void* function (const(void)* ctx); 48 alias gnutls_digest_init_func = int function (gnutls_digest_algorithm_t, void** ctx); 49 alias gnutls_digest_hash_func = int function (void* ctx, const(void)* text, size_t textsize); 50 alias gnutls_digest_output_func = int function (void* src_ctx, void* digest, size_t digestsize); 51 alias gnutls_digest_deinit_func = void function (void* ctx); 52 alias gnutls_digest_fast_func = int function (gnutls_digest_algorithm_t, const(void)* text, size_t textsize, void* digest); 53 alias gnutls_digest_copy_func = void* function (const(void)* ctx); 54 } 55 56 version (BindGnuTLS_Static) 57 { 58 extern (System) @nogc nothrow @system: 59 60 int gnutls_cipher_init (gnutls_cipher_hd_t* handle, gnutls_cipher_algorithm_t cipher, const(gnutls_datum_t)* key, const(gnutls_datum_t)* iv); 61 int gnutls_cipher_encrypt (const gnutls_cipher_hd_t handle, void* text, size_t textlen); 62 int gnutls_cipher_decrypt (const gnutls_cipher_hd_t handle, void* ciphertext, size_t ciphertextlen); 63 int gnutls_cipher_decrypt2 (gnutls_cipher_hd_t handle, const(void)* ciphertext, size_t ciphertextlen, void* text, size_t textlen); 64 int gnutls_cipher_encrypt2 (gnutls_cipher_hd_t handle, const(void)* text, size_t textlen, void* ciphertext, size_t ciphertextlen); 65 void gnutls_cipher_set_iv (gnutls_cipher_hd_t handle, void* iv, size_t ivlen); 66 int gnutls_cipher_tag (gnutls_cipher_hd_t handle, void* tag, size_t tag_size); 67 int gnutls_cipher_add_auth (gnutls_cipher_hd_t handle, const(void)* text, size_t text_size); 68 void gnutls_cipher_deinit (gnutls_cipher_hd_t handle); 69 uint gnutls_cipher_get_block_size (gnutls_cipher_algorithm_t algorithm); 70 uint gnutls_cipher_get_iv_size (gnutls_cipher_algorithm_t algorithm); 71 uint gnutls_cipher_get_tag_size (gnutls_cipher_algorithm_t algorithm); 72 int gnutls_aead_cipher_init (gnutls_aead_cipher_hd_t* handle, gnutls_cipher_algorithm_t cipher, const(gnutls_datum_t)* key); 73 int gnutls_aead_cipher_decrypt (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(void)* auth, size_t auth_len, size_t tag_size, const(void)* ctext, size_t ctext_len, void* ptext, size_t* ptext_len); 74 int gnutls_aead_cipher_encrypt (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(void)* auth, size_t auth_len, size_t tag_size, const(void)* ptext, size_t ptext_len, void* ctext, size_t* ctext_len); 75 76 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 77 int gnutls_aead_cipher_encryptv (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, size_t tag_size, const(giovec_t)* iov, int iovcnt, void* ctext, size_t* ctext_len); 78 79 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_10) 80 { 81 int gnutls_aead_cipher_encryptv2 (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, const(giovec_t)* iov, int iovcnt, void* tag, size_t* tag_size); 82 int gnutls_aead_cipher_decryptv2 (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, const(giovec_t)* iov, int iovcnt, void* tag, size_t tag_size); 83 } 84 85 void gnutls_aead_cipher_deinit (gnutls_aead_cipher_hd_t handle); 86 size_t gnutls_mac_get_nonce_size (gnutls_mac_algorithm_t algorithm); 87 int gnutls_hmac_init (gnutls_hmac_hd_t* dig, gnutls_mac_algorithm_t algorithm, const(void)* key, size_t keylen); 88 void gnutls_hmac_set_nonce (gnutls_hmac_hd_t handle, const(void)* nonce, size_t nonce_len); 89 int gnutls_hmac (gnutls_hmac_hd_t handle, const(void)* text, size_t textlen); 90 void gnutls_hmac_output (gnutls_hmac_hd_t handle, void* digest); 91 void gnutls_hmac_deinit (gnutls_hmac_hd_t handle, void* digest); 92 uint gnutls_hmac_get_len (gnutls_mac_algorithm_t algorithm); 93 uint gnutls_hmac_get_key_size (gnutls_mac_algorithm_t algorithm); 94 int gnutls_hmac_fast (gnutls_mac_algorithm_t algorithm, const(void)* key, size_t keylen, const(void)* text, size_t textlen, void* digest); 95 96 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 97 gnutls_hmac_hd_t gnutls_hmac_copy (gnutls_hmac_hd_t handle); 98 99 int gnutls_hash_init (gnutls_hash_hd_t* dig, gnutls_digest_algorithm_t algorithm); 100 int gnutls_hash (gnutls_hash_hd_t handle, const(void)* text, size_t textlen); 101 void gnutls_hash_output (gnutls_hash_hd_t handle, void* digest); 102 void gnutls_hash_deinit (gnutls_hash_hd_t handle, void* digest); 103 uint gnutls_hash_get_len (gnutls_digest_algorithm_t algorithm); 104 int gnutls_hash_fast (gnutls_digest_algorithm_t algorithm, const(void)* text, size_t textlen, void* digest); 105 106 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 107 gnutls_hash_hd_t gnutls_hash_copy (gnutls_hash_hd_t handle); 108 109 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_13) 110 { 111 int gnutls_hkdf_extract (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* salt, void* output); 112 int gnutls_hkdf_expand (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* info, void* output, size_t length); 113 int gnutls_pbkdf2 (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* salt, uint iter_count, void* output, size_t length); 114 } 115 116 int gnutls_rnd (gnutls_rnd_level_t level, void* data, size_t len); 117 void gnutls_rnd_refresh (); 118 119 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 120 { 121 deprecated("Deprecated vrom GnuTLS 3.6.9") 122 { 123 int gnutls_crypto_register_cipher (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_setiv_func setiv, gnutls_cipher_encrypt_func encrypt, gnutls_cipher_decrypt_func decrypt, gnutls_cipher_deinit_func deinit); 124 int gnutls_crypto_register_aead_cipher (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_aead_encrypt_func aead_encrypt, gnutls_cipher_aead_decrypt_func aead_decrypt, gnutls_cipher_deinit_func deinit); 125 int gnutls_crypto_register_mac (gnutls_mac_algorithm_t mac, int priority, gnutls_mac_init_func init, gnutls_mac_setkey_func setkey, gnutls_mac_setnonce_func setnonce, gnutls_mac_hash_func hash, gnutls_mac_output_func output, gnutls_mac_deinit_func deinit, gnutls_mac_fast_func hash_fast); 126 int gnutls_crypto_register_digest (gnutls_digest_algorithm_t digest, int priority, gnutls_digest_init_func init, gnutls_digest_hash_func hash, gnutls_digest_output_func output, gnutls_digest_deinit_func deinit, gnutls_digest_fast_func hash_fast); 127 } 128 } 129 else 130 { 131 int gnutls_crypto_register_cipher (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_setiv_func setiv, gnutls_cipher_encrypt_func encrypt, gnutls_cipher_decrypt_func decrypt, gnutls_cipher_deinit_func deinit); 132 int gnutls_crypto_register_aead_cipher (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_aead_encrypt_func aead_encrypt, gnutls_cipher_aead_decrypt_func aead_decrypt, gnutls_cipher_deinit_func deinit); 133 int gnutls_crypto_register_mac (gnutls_mac_algorithm_t mac, int priority, gnutls_mac_init_func init, gnutls_mac_setkey_func setkey, gnutls_mac_setnonce_func setnonce, gnutls_mac_hash_func hash, gnutls_mac_output_func output, gnutls_mac_deinit_func deinit, gnutls_mac_fast_func hash_fast); 134 int gnutls_crypto_register_digest (gnutls_digest_algorithm_t digest, int priority, gnutls_digest_init_func init, gnutls_digest_hash_func hash, gnutls_digest_output_func output, gnutls_digest_deinit_func deinit, gnutls_digest_fast_func hash_fast); 135 } 136 137 int gnutls_encode_ber_digest_info (gnutls_digest_algorithm_t hash, const(gnutls_datum_t)* digest, gnutls_datum_t* output); 138 int gnutls_decode_ber_digest_info (const(gnutls_datum_t)* info, gnutls_digest_algorithm_t* hash, ubyte* digest, uint* digest_size); 139 140 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_0) 141 { 142 int gnutls_decode_rs_value (const(gnutls_datum_t)* sig_value, gnutls_datum_t* r, gnutls_datum_t* s); 143 int gnutls_encode_rs_value (gnutls_datum_t* sig_value, const(gnutls_datum_t)* r, const(gnutls_datum_t)* s); 144 } 145 else 146 { 147 // workaround to enable these in older versions too (private but exported) 148 int _gnutls_decode_ber_rs_raw (const(gnutls_datum_t)* sig_value, gnutls_datum_t* r, gnutls_datum_t* s); 149 int _gnutls_encode_ber_rs_raw (gnutls_datum_t* sig_value, const(gnutls_datum_t)* r, const(gnutls_datum_t)* s); 150 alias gnutls_decode_rs_value = _gnutls_decode_ber_rs_raw; 151 alias gnutls_encode_rs_value = _gnutls_encode_ber_rs_raw; 152 } 153 154 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 155 { 156 int gnutls_encode_gost_rs_value (gnutls_datum_t* sig_value, const(gnutls_datum_t)* r, const(gnutls_datum_t)* s); 157 int gnutls_decode_gost_rs_value (const(gnutls_datum_t)* sig_value, gnutls_datum_t* r, gnutls_datum_t* s); 158 } 159 } 160 else 161 { 162 extern (System) @nogc nothrow @system 163 { 164 alias pgnutls_cipher_init = int function (gnutls_cipher_hd_t* handle, gnutls_cipher_algorithm_t cipher, const(gnutls_datum_t)* key, const(gnutls_datum_t)* iv); 165 alias pgnutls_cipher_encrypt = int function (const gnutls_cipher_hd_t handle, void* text, size_t textlen); 166 alias pgnutls_cipher_decrypt = int function (const gnutls_cipher_hd_t handle, void* ciphertext, size_t ciphertextlen); 167 alias pgnutls_cipher_decrypt2 = int function (gnutls_cipher_hd_t handle, const(void)* ciphertext, size_t ciphertextlen, void* text, size_t textlen); 168 alias pgnutls_cipher_encrypt2 = int function (gnutls_cipher_hd_t handle, const(void)* text, size_t textlen, void* ciphertext, size_t ciphertextlen); 169 alias pgnutls_cipher_set_iv = void function (gnutls_cipher_hd_t handle, void* iv, size_t ivlen); 170 alias pgnutls_cipher_tag = int function (gnutls_cipher_hd_t handle, void* tag, size_t tag_size); 171 alias pgnutls_cipher_add_auth = int function (gnutls_cipher_hd_t handle, const(void)* text, size_t text_size); 172 alias pgnutls_cipher_deinit = void function (gnutls_cipher_hd_t handle); 173 alias pgnutls_cipher_get_block_size = uint function (gnutls_cipher_algorithm_t algorithm); 174 alias pgnutls_cipher_get_iv_size = uint function (gnutls_cipher_algorithm_t algorithm); 175 alias pgnutls_cipher_get_tag_size = uint function (gnutls_cipher_algorithm_t algorithm); 176 alias pgnutls_aead_cipher_init = int function (gnutls_aead_cipher_hd_t* handle, gnutls_cipher_algorithm_t cipher, const(gnutls_datum_t)* key); 177 alias pgnutls_aead_cipher_decrypt = int function (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(void)* auth, size_t auth_len, size_t tag_size, const(void)* ctext, size_t ctext_len, void* ptext, size_t* ptext_len); 178 alias pgnutls_aead_cipher_encrypt = int function (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(void)* auth, size_t auth_len, size_t tag_size, const(void)* ptext, size_t ptext_len, void* ctext, size_t* ctext_len); 179 180 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 181 alias pgnutls_aead_cipher_encryptv = int function (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, size_t tag_size, const(giovec_t)* iov, int iovcnt, void* ctext, size_t* ctext_len); 182 183 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_10) 184 { 185 alias pgnutls_aead_cipher_encryptv2 = int function (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, const(giovec_t)* iov, int iovcnt, void* tag, size_t* tag_size); 186 alias pgnutls_aead_cipher_decryptv2 = int function (gnutls_aead_cipher_hd_t handle, const(void)* nonce, size_t nonce_len, const(giovec_t)* auth_iov, int auth_iovcnt, const(giovec_t)* iov, int iovcnt, void* tag, size_t tag_size); 187 } 188 189 alias pgnutls_aead_cipher_deinit = void function (gnutls_aead_cipher_hd_t handle); 190 alias pgnutls_mac_get_nonce_size = size_t function (gnutls_mac_algorithm_t algorithm); 191 alias pgnutls_hmac_init = int function (gnutls_hmac_hd_t* dig, gnutls_mac_algorithm_t algorithm, const(void)* key, size_t keylen); 192 alias pgnutls_hmac_set_nonce = void function (gnutls_hmac_hd_t handle, const(void)* nonce, size_t nonce_len); 193 alias pgnutls_hmac = int function (gnutls_hmac_hd_t handle, const(void)* text, size_t textlen); 194 alias pgnutls_hmac_output = void function (gnutls_hmac_hd_t handle, void* digest); 195 alias pgnutls_hmac_deinit = void function (gnutls_hmac_hd_t handle, void* digest); 196 alias pgnutls_hmac_get_len = uint function (gnutls_mac_algorithm_t algorithm); 197 alias pgnutls_hmac_get_key_size = uint function (gnutls_mac_algorithm_t algorithm); 198 alias pgnutls_hmac_fast = int function (gnutls_mac_algorithm_t algorithm, const(void)* key, size_t keylen, const(void)* text, size_t textlen, void* digest); 199 200 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 201 alias pgnutls_hmac_copy = gnutls_hmac_hd_t function (gnutls_hmac_hd_t handle); 202 203 alias pgnutls_hash_init = int function (gnutls_hash_hd_t* dig, gnutls_digest_algorithm_t algorithm); 204 alias pgnutls_hash = int function (gnutls_hash_hd_t handle, const(void)* text, size_t textlen); 205 alias pgnutls_hash_output = void function (gnutls_hash_hd_t handle, void* digest); 206 alias pgnutls_hash_deinit = void function (gnutls_hash_hd_t handle, void* digest); 207 alias pgnutls_hash_get_len = uint function (gnutls_digest_algorithm_t algorithm); 208 alias pgnutls_hash_fast = int function (gnutls_digest_algorithm_t algorithm, const(void)* text, size_t textlen, void* digest); 209 210 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 211 alias pgnutls_hash_copy = gnutls_hash_hd_t function (gnutls_hash_hd_t handle); 212 213 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_13) 214 { 215 alias pgnutls_hkdf_extract = int function (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* salt, void* output); 216 alias pgnutls_hkdf_expand = int function (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* info, void* output, size_t length); 217 alias pgnutls_pbkdf2 = int function (gnutls_mac_algorithm_t mac, const(gnutls_datum_t)* key, const(gnutls_datum_t)* salt, uint iter_count, void* output, size_t length); 218 } 219 220 alias pgnutls_rnd = int function (gnutls_rnd_level_t level, void* data, size_t len); 221 alias pgnutls_rnd_refresh = void function (); 222 alias pgnutls_crypto_register_cipher = int function (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_setiv_func setiv, gnutls_cipher_encrypt_func encrypt, gnutls_cipher_decrypt_func decrypt, gnutls_cipher_deinit_func deinit); 223 alias pgnutls_crypto_register_aead_cipher = int function (gnutls_cipher_algorithm_t algorithm, int priority, gnutls_cipher_init_func init, gnutls_cipher_setkey_func setkey, gnutls_cipher_aead_encrypt_func aead_encrypt, gnutls_cipher_aead_decrypt_func aead_decrypt, gnutls_cipher_deinit_func deinit); 224 alias pgnutls_crypto_register_mac = int function (gnutls_mac_algorithm_t mac, int priority, gnutls_mac_init_func init, gnutls_mac_setkey_func setkey, gnutls_mac_setnonce_func setnonce, gnutls_mac_hash_func hash, gnutls_mac_output_func output, gnutls_mac_deinit_func deinit, gnutls_mac_fast_func hash_fast); 225 alias pgnutls_crypto_register_digest = int function (gnutls_digest_algorithm_t digest, int priority, gnutls_digest_init_func init, gnutls_digest_hash_func hash, gnutls_digest_output_func output, gnutls_digest_deinit_func deinit, gnutls_digest_fast_func hash_fast); 226 alias pgnutls_encode_ber_digest_info = int function (gnutls_digest_algorithm_t hash, const(gnutls_datum_t)* digest, gnutls_datum_t* output); 227 alias pgnutls_decode_ber_digest_info = int function (const(gnutls_datum_t)* info, gnutls_digest_algorithm_t* hash, ubyte* digest, uint* digest_size); 228 229 // Note that these were added in 3.6.0, but are bound using exported private symbols 230 alias pgnutls_decode_rs_value = int function (const(gnutls_datum_t)* sig_value, gnutls_datum_t* r, gnutls_datum_t* s); 231 alias pgnutls_encode_rs_value = int function (gnutls_datum_t* sig_value, const(gnutls_datum_t)* r, const(gnutls_datum_t)* s); 232 233 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 234 { 235 alias pgnutls_encode_gost_rs_value = int function (gnutls_datum_t* sig_value, const(gnutls_datum_t)* r, const(gnutls_datum_t)* s); 236 alias pgnutls_decode_gost_rs_value = int function (const(gnutls_datum_t)* sig_value, gnutls_datum_t* r, gnutls_datum_t* s); 237 } 238 } 239 240 __gshared 241 { 242 pgnutls_cipher_init gnutls_cipher_init; 243 pgnutls_cipher_encrypt gnutls_cipher_encrypt; 244 pgnutls_cipher_decrypt gnutls_cipher_decrypt; 245 pgnutls_cipher_decrypt2 gnutls_cipher_decrypt2; 246 pgnutls_cipher_encrypt2 gnutls_cipher_encrypt2; 247 pgnutls_cipher_set_iv gnutls_cipher_set_iv; 248 pgnutls_cipher_tag gnutls_cipher_tag; 249 pgnutls_cipher_add_auth gnutls_cipher_add_auth; 250 pgnutls_cipher_deinit gnutls_cipher_deinit; 251 pgnutls_cipher_get_block_size gnutls_cipher_get_block_size; 252 pgnutls_cipher_get_iv_size gnutls_cipher_get_iv_size; 253 pgnutls_cipher_get_tag_size gnutls_cipher_get_tag_size; 254 pgnutls_aead_cipher_init gnutls_aead_cipher_init; 255 pgnutls_aead_cipher_decrypt gnutls_aead_cipher_decrypt; 256 pgnutls_aead_cipher_encrypt gnutls_aead_cipher_encrypt; 257 258 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 259 pgnutls_aead_cipher_encryptv gnutls_aead_cipher_encryptv; 260 261 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_10) 262 { 263 pgnutls_aead_cipher_encryptv2 gnutls_aead_cipher_encryptv2; 264 pgnutls_aead_cipher_decryptv2 gnutls_aead_cipher_decryptv2; 265 } 266 267 pgnutls_aead_cipher_deinit gnutls_aead_cipher_deinit; 268 pgnutls_mac_get_nonce_size gnutls_mac_get_nonce_size; 269 pgnutls_hmac_init gnutls_hmac_init; 270 pgnutls_hmac_set_nonce gnutls_hmac_set_nonce; 271 pgnutls_hmac gnutls_hmac; 272 pgnutls_hmac_output gnutls_hmac_output; 273 pgnutls_hmac_deinit gnutls_hmac_deinit; 274 pgnutls_hmac_get_len gnutls_hmac_get_len; 275 pgnutls_hmac_get_key_size gnutls_hmac_get_key_size; 276 pgnutls_hmac_fast gnutls_hmac_fast; 277 278 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 279 pgnutls_hmac_copy gnutls_hmac_copy; 280 281 pgnutls_hash_init gnutls_hash_init; 282 pgnutls_hash gnutls_hash; 283 pgnutls_hash_output gnutls_hash_output; 284 pgnutls_hash_deinit gnutls_hash_deinit; 285 pgnutls_hash_get_len gnutls_hash_get_len; 286 pgnutls_hash_fast gnutls_hash_fast; 287 288 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 289 pgnutls_hash_copy gnutls_hash_copy; 290 291 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_13) 292 { 293 pgnutls_hkdf_extract gnutls_hkdf_extract; 294 pgnutls_hkdf_expand gnutls_hkdf_expand; 295 pgnutls_pbkdf2 gnutls_pbkdf2; 296 } 297 298 pgnutls_rnd gnutls_rnd; 299 pgnutls_rnd_refresh gnutls_rnd_refresh; 300 301 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 302 { 303 deprecated("Deprecated vrom GnuTLS 3.6.9") 304 { 305 pgnutls_crypto_register_cipher gnutls_crypto_register_cipher; 306 pgnutls_crypto_register_aead_cipher gnutls_crypto_register_aead_cipher; 307 pgnutls_crypto_register_mac gnutls_crypto_register_mac; 308 pgnutls_crypto_register_digest gnutls_crypto_register_digest; 309 } 310 } 311 else 312 { 313 pgnutls_crypto_register_cipher gnutls_crypto_register_cipher; 314 pgnutls_crypto_register_aead_cipher gnutls_crypto_register_aead_cipher; 315 pgnutls_crypto_register_mac gnutls_crypto_register_mac; 316 pgnutls_crypto_register_digest gnutls_crypto_register_digest; 317 } 318 319 pgnutls_encode_ber_digest_info gnutls_encode_ber_digest_info; 320 pgnutls_decode_ber_digest_info gnutls_decode_ber_digest_info; 321 322 // Note that these were added in 3.6.0, but are bound using exported private symbols 323 pgnutls_decode_rs_value gnutls_decode_rs_value; 324 pgnutls_encode_rs_value gnutls_encode_rs_value; 325 326 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 327 { 328 pgnutls_encode_gost_rs_value gnutls_encode_gost_rs_value; 329 pgnutls_decode_gost_rs_value gnutls_decode_gost_rs_value; 330 } 331 } 332 333 import bindbc.loader : SharedLib, bindSymbol_stdcall; 334 void bindCrypto(SharedLib lib) 335 { 336 lib.bindSymbol_stdcall(gnutls_cipher_init, "gnutls_cipher_init"); 337 lib.bindSymbol_stdcall(gnutls_cipher_encrypt, "gnutls_cipher_encrypt"); 338 lib.bindSymbol_stdcall(gnutls_cipher_decrypt, "gnutls_cipher_decrypt"); 339 lib.bindSymbol_stdcall(gnutls_cipher_decrypt2, "gnutls_cipher_decrypt2"); 340 lib.bindSymbol_stdcall(gnutls_cipher_encrypt2, "gnutls_cipher_encrypt2"); 341 lib.bindSymbol_stdcall(gnutls_cipher_set_iv, "gnutls_cipher_set_iv"); 342 lib.bindSymbol_stdcall(gnutls_cipher_tag, "gnutls_cipher_tag"); 343 lib.bindSymbol_stdcall(gnutls_cipher_add_auth, "gnutls_cipher_add_auth"); 344 lib.bindSymbol_stdcall(gnutls_cipher_deinit, "gnutls_cipher_deinit"); 345 lib.bindSymbol_stdcall(gnutls_cipher_get_block_size, "gnutls_cipher_get_block_size"); 346 lib.bindSymbol_stdcall(gnutls_cipher_get_iv_size, "gnutls_cipher_get_iv_size"); 347 lib.bindSymbol_stdcall(gnutls_cipher_get_tag_size, "gnutls_cipher_get_tag_size"); 348 lib.bindSymbol_stdcall(gnutls_aead_cipher_init, "gnutls_aead_cipher_init"); 349 lib.bindSymbol_stdcall(gnutls_aead_cipher_decrypt, "gnutls_aead_cipher_decrypt"); 350 lib.bindSymbol_stdcall(gnutls_aead_cipher_encrypt, "gnutls_aead_cipher_encrypt"); 351 352 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 353 lib.bindSymbol_stdcall(gnutls_aead_cipher_encryptv, "gnutls_aead_cipher_encryptv"); 354 355 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_10) 356 { 357 lib.bindSymbol_stdcall(gnutls_aead_cipher_encryptv2, "gnutls_aead_cipher_encryptv2"); 358 lib.bindSymbol_stdcall(gnutls_aead_cipher_decryptv2, "gnutls_aead_cipher_decryptv2"); 359 } 360 361 lib.bindSymbol_stdcall(gnutls_aead_cipher_deinit, "gnutls_aead_cipher_deinit"); 362 lib.bindSymbol_stdcall(gnutls_mac_get_nonce_size, "gnutls_mac_get_nonce_size"); 363 lib.bindSymbol_stdcall(gnutls_hmac_init, "gnutls_hmac_init"); 364 lib.bindSymbol_stdcall(gnutls_hmac_set_nonce, "gnutls_hmac_set_nonce"); 365 lib.bindSymbol_stdcall(gnutls_hmac, "gnutls_hmac"); 366 lib.bindSymbol_stdcall(gnutls_hmac_output, "gnutls_hmac_output"); 367 lib.bindSymbol_stdcall(gnutls_hmac_deinit, "gnutls_hmac_deinit"); 368 lib.bindSymbol_stdcall(gnutls_hmac_get_len, "gnutls_hmac_get_len"); 369 lib.bindSymbol_stdcall(gnutls_hmac_get_key_size, "gnutls_hmac_get_key_size"); 370 lib.bindSymbol_stdcall(gnutls_hmac_fast, "gnutls_hmac_fast"); 371 372 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 373 lib.bindSymbol_stdcall(gnutls_hmac_copy, "gnutls_hmac_copy"); 374 375 lib.bindSymbol_stdcall(gnutls_hash_init, "gnutls_hash_init"); 376 lib.bindSymbol_stdcall(gnutls_hash, "gnutls_hash"); 377 lib.bindSymbol_stdcall(gnutls_hash_output, "gnutls_hash_output"); 378 lib.bindSymbol_stdcall(gnutls_hash_deinit, "gnutls_hash_deinit"); 379 lib.bindSymbol_stdcall(gnutls_hash_get_len, "gnutls_hash_get_len"); 380 lib.bindSymbol_stdcall(gnutls_hash_fast, "gnutls_hash_fast"); 381 382 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_9) 383 lib.bindSymbol_stdcall(gnutls_hash_copy, "gnutls_hash_copy"); 384 385 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_13) 386 { 387 lib.bindSymbol_stdcall(gnutls_hkdf_extract, "gnutls_hkdf_extract"); 388 lib.bindSymbol_stdcall(gnutls_hkdf_expand, "gnutls_hkdf_expand"); 389 lib.bindSymbol_stdcall(gnutls_pbkdf2, "gnutls_pbkdf2"); 390 } 391 392 lib.bindSymbol_stdcall(gnutls_rnd, "gnutls_rnd"); 393 lib.bindSymbol_stdcall(gnutls_rnd_refresh, "gnutls_rnd_refresh"); 394 lib.bindSymbol_stdcall(gnutls_crypto_register_cipher, "gnutls_crypto_register_cipher"); 395 lib.bindSymbol_stdcall(gnutls_crypto_register_aead_cipher, "gnutls_crypto_register_aead_cipher"); 396 lib.bindSymbol_stdcall(gnutls_crypto_register_mac, "gnutls_crypto_register_mac"); 397 lib.bindSymbol_stdcall(gnutls_crypto_register_digest, "gnutls_crypto_register_digest"); 398 lib.bindSymbol_stdcall(gnutls_encode_ber_digest_info, "gnutls_encode_ber_digest_info"); 399 lib.bindSymbol_stdcall(gnutls_decode_ber_digest_info, "gnutls_decode_ber_digest_info"); 400 401 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_0) 402 { 403 lib.bindSymbol_stdcall(gnutls_decode_rs_value, "gnutls_decode_rs_value"); 404 lib.bindSymbol_stdcall(gnutls_encode_rs_value, "gnutls_encode_rs_value"); 405 } 406 else 407 { 408 // workaround to enable these even with the older GnuTLS libs 409 lib.bindSymbol_stdcall(gnutls_decode_rs_value, "_gnutls_decode_ber_rs_raw"); 410 lib.bindSymbol_stdcall(gnutls_encode_rs_value, "_gnutls_encode_ber_rs_raw"); 411 } 412 413 static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3) 414 { 415 lib.bindSymbol_stdcall(gnutls_encode_gost_rs_value, "gnutls_encode_gost_rs_value"); 416 lib.bindSymbol_stdcall(gnutls_decode_gost_rs_value, "gnutls_decode_gost_rs_value"); 417 } 418 } 419 }