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 }