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 }