1 /*******************************************************************************
2 
3     D language bindings for libsodium's sodium.h
4 
5     License: ISC (see LICENSE.txt)
6 
7 *******************************************************************************/
8 
9 module libsodium;
10 
11 public import libsodium.core;
12 public import libsodium.crypto_aead_aes256gcm;
13 public import libsodium.crypto_aead_chacha20poly1305;
14 public import libsodium.crypto_aead_xchacha20poly1305;
15 public import libsodium.crypto_auth;
16 public import libsodium.crypto_auth_hmacsha256;
17 public import libsodium.crypto_auth_hmacsha512256;
18 public import libsodium.crypto_auth_hmacsha512;
19 public import libsodium.crypto_box;
20 public import libsodium.crypto_box_curve25519xchacha20poly1305;
21 public import libsodium.crypto_box_curve25519xsalsa20poly1305;
22 public import libsodium.crypto_core_ed25519;
23 public import libsodium.crypto_core_hchacha20;
24 public import libsodium.crypto_core_hsalsa20;
25 public import libsodium.crypto_core_ristretto255;
26 public import libsodium.crypto_core_salsa2012;
27 public import libsodium.crypto_core_salsa208;
28 public import libsodium.crypto_core_salsa20;
29 public import libsodium.crypto_generichash;
30 public import libsodium.crypto_generichash_blake2b;
31 public import libsodium.crypto_hash;
32 public import libsodium.crypto_hash_sha256;
33 public import libsodium.crypto_hash_sha512;
34 public import libsodium.crypto_kdf;
35 public import libsodium.crypto_kdf_blake2b;
36 public import libsodium.crypto_kx;
37 public import libsodium.crypto_onetimeauth;
38 public import libsodium.crypto_onetimeauth_poly1305;
39 public import libsodium.crypto_pwhash;
40 public import libsodium.crypto_pwhash_argon2i;
41 public import libsodium.crypto_pwhash_argon2id;
42 public import libsodium.crypto_pwhash_scryptsalsa208sha256;
43 public import libsodium.crypto_scalarmult;
44 public import libsodium.crypto_scalarmult_curve25519;
45 public import libsodium.crypto_scalarmult_ed25519;
46 public import libsodium.crypto_scalarmult_ristretto255;
47 public import libsodium.crypto_secretbox;
48 public import libsodium.crypto_secretbox_xchacha20poly1305;
49 public import libsodium.crypto_secretbox_xsalsa20poly1305;
50 public import libsodium.crypto_secretstream_xchacha20poly1305;
51 public import libsodium.crypto_shorthash;
52 public import libsodium.crypto_shorthash_siphash24;
53 public import libsodium.crypto_sign;
54 public import libsodium.crypto_sign_ed25519;
55 public import libsodium.crypto_sign_edwards25519sha512batch;
56 public import libsodium.crypto_stream;
57 public import libsodium.crypto_stream_chacha20;
58 public import libsodium.crypto_stream_salsa2012;
59 public import libsodium.crypto_stream_salsa208;
60 public import libsodium.crypto_stream_salsa20;
61 public import libsodium.crypto_stream_xchacha20;
62 public import libsodium.crypto_stream_xsalsa20;
63 public import libsodium.crypto_verify_16;
64 public import libsodium.crypto_verify_32;
65 public import libsodium.crypto_verify_64;
66 public import libsodium.export_;
67 public import libsodium.randombytes;
68 public import libsodium.randombytes_internal_random;
69 public import libsodium.randombytes_nativeclient;
70 public import libsodium.randombytes_sysrandom;
71 public import libsodium.runtime;
72 public import libsodium.utils;
73 
74 version (unittest)
75 shared static this ()
76 {
77     auto res = sodium_init();
78     assert(res >= 0);
79 }
80 
81 /// https://libsodium.gitbook.io/doc/secret-key_cryptography/authenticated_encryption
82 unittest
83 {
84     static immutable message = "Hello world";
85 
86     ubyte[crypto_secretbox_KEYBYTES] key;
87     ubyte[crypto_secretbox_NONCEBYTES] nonce;
88     ubyte[crypto_secretbox_MACBYTES + message.length] cipher;
89 
90     crypto_secretbox_keygen(key);
91     randombytes_buf(nonce.ptr, nonce.length);
92     crypto_secretbox_easy(cipher.ptr, cast(const(ubyte*))message.ptr, message.length,
93                           nonce.ptr, key.ptr);
94 
95     ubyte[message.length] decrypted;
96     if (crypto_secretbox_open_easy(decrypted.ptr, cipher.ptr, cipher.length,
97                                    nonce.ptr, key.ptr) != 0) {
98         assert(0);
99     }
100 }
101 
102 /// https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption
103 unittest
104 {
105     static immutable message = "authenticated encryption";
106 
107     ubyte[crypto_box_PUBLICKEYBYTES] alice_publickey;
108     ubyte[crypto_box_SECRETKEYBYTES] alice_secretkey;
109     crypto_box_keypair(alice_publickey.ptr, alice_secretkey.ptr);
110 
111     ubyte[crypto_box_PUBLICKEYBYTES] bob_publickey;
112     ubyte[crypto_box_SECRETKEYBYTES] bob_secretkey;
113     crypto_box_keypair(bob_publickey.ptr, bob_secretkey.ptr);
114 
115     ubyte[crypto_box_NONCEBYTES] nonce;
116     ubyte[crypto_box_MACBYTES + message.length] ciphertext;
117     randombytes_buf(nonce.ptr, nonce.length);
118 
119     if (crypto_box_easy(ciphertext.ptr, cast(const(ubyte*))message.ptr,
120                         message.length, nonce.ptr,
121                         bob_publickey.ptr, alice_secretkey.ptr) != 0) {
122         assert(0);
123     }
124 
125     ubyte[message.length] decrypted;
126     if (crypto_box_open_easy(
127             decrypted.ptr, ciphertext.ptr, ciphertext.length, nonce.ptr,
128             alice_publickey.ptr, bob_secretkey.ptr) != 0) {
129         assert(0);
130     }
131 }