1 // Written in the D programming language.
2 
3 module wrapper.sodium.crypto_box_curve25519xsalsa20poly1305;
4 
5 import wrapper.sodium.core; // assure sodium got initialized
6 
7 public
8 import  deimos.sodium.crypto_box_curve25519xsalsa20poly1305: crypto_box_curve25519xsalsa20poly1305_SEEDBYTES,
9                                                              crypto_box_curve25519xsalsa20poly1305_seedbytes,
10                                                              crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES,
11                                                              crypto_box_curve25519xsalsa20poly1305_publickeybytes,
12                                                              crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES,
13                                                              crypto_box_curve25519xsalsa20poly1305_secretkeybytes,
14                                                              crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES,
15                                                              crypto_box_curve25519xsalsa20poly1305_beforenmbytes,
16                                                              crypto_box_curve25519xsalsa20poly1305_NONCEBYTES,
17                                                              crypto_box_curve25519xsalsa20poly1305_noncebytes,
18                                                              crypto_box_curve25519xsalsa20poly1305_MACBYTES,
19                                                              crypto_box_curve25519xsalsa20poly1305_macbytes;
20 /*                                                           crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES,
21                                                              crypto_box_curve25519xsalsa20poly1305_boxzerobytes,
22                                                              crypto_box_curve25519xsalsa20poly1305_ZEROBYTES,
23                                                              crypto_box_curve25519xsalsa20poly1305_zerobytes,
24                                                              crypto_box_curve25519xsalsa20poly1305,
25                                                              crypto_box_curve25519xsalsa20poly1305_open,
26                                                              crypto_box_curve25519xsalsa20poly1305_seed_keypair,
27                                                              crypto_box_curve25519xsalsa20poly1305_keypair,
28                                                              crypto_box_curve25519xsalsa20poly1305_beforenm,
29                                                              crypto_box_curve25519xsalsa20poly1305_afternm,
30                                                              crypto_box_curve25519xsalsa20poly1305_open_afternm; */
31 
32 import std.exception : assertThrown;
33 
34 
35 // overloading some functions between module deimos.sodium.crypto_box_curve25519xsalsa20poly1305 and this module
36 
37 /* No overloads for -- NaCl compatibility interface ; Requires padding -- */
38 
39 
40 alias crypto_box_curve25519xsalsa20poly1305_seed_keypair = deimos.sodium.crypto_box_curve25519xsalsa20poly1305.crypto_box_curve25519xsalsa20poly1305_seed_keypair;
41 
42 pragma(inline, true)
43 bool  crypto_box_curve25519xsalsa20poly1305_seed_keypair(out   ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES] pk,
44                                                          out   ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES] sk,
45                                                          const ubyte[crypto_box_curve25519xsalsa20poly1305_SEEDBYTES] seed) pure @nogc @trusted
46 {
47   return  crypto_box_curve25519xsalsa20poly1305_seed_keypair(pk.ptr, sk.ptr, seed.ptr) == 0; // __attribute__ ((nonnull));
48 }
49 
50 alias crypto_box_curve25519xsalsa20poly1305_keypair      = deimos.sodium.crypto_box_curve25519xsalsa20poly1305.crypto_box_curve25519xsalsa20poly1305_keypair;
51 
52 pragma(inline, true)
53 bool  crypto_box_curve25519xsalsa20poly1305_keypair(out ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES] pk,
54                                                     out ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES] sk) nothrow @nogc @trusted
55 {
56   return  crypto_box_curve25519xsalsa20poly1305_keypair(pk.ptr, sk.ptr) == 0; // __attribute__ ((nonnull));
57 }
58 
59 /* -- Precomputation interface -- */
60 
61 alias crypto_box_curve25519xsalsa20poly1305_beforenm = deimos.sodium.crypto_box_curve25519xsalsa20poly1305.crypto_box_curve25519xsalsa20poly1305_beforenm;
62 
63 pragma(inline, true)
64 bool  crypto_box_curve25519xsalsa20poly1305_beforenm(out   ubyte[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES] k,
65                                                      const ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES] pk,
66                                                      const ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES] sk) pure nothrow @nogc @trusted // __attribute__ ((warn_unused_result));
67 {
68   return  crypto_box_curve25519xsalsa20poly1305_beforenm(k.ptr, pk.ptr, sk.ptr) == 0;// __attribute__ ((warn_unused_result))  __attribute__ ((nonnull));
69 }
70 
71 
72 @system
73 unittest
74 {
75   import std.stdio : writeln;
76   import wrapper.sodium.randombytes;
77   debug writeln("unittest block 1 from sodium.crypto_box_curve25519xsalsa20poly1305.d");
78 
79   ubyte[crypto_box_curve25519xsalsa20poly1305_SEEDBYTES] seed = void;
80   randombytes_buf(seed.ptr, seed.length);
81   ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES]  alice_publickey = void;
82   ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES]  alice_secretkey = void;
83   crypto_box_curve25519xsalsa20poly1305_seed_keypair(alice_publickey.ptr, alice_secretkey.ptr, seed.ptr);
84 
85   ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES]  bob_publickey = void;
86   ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES]  bob_secretkey = void;
87   crypto_box_curve25519xsalsa20poly1305_keypair(bob_publickey.ptr, bob_secretkey.ptr);
88 
89   ubyte[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES]  shared_k = void;
90   assert(crypto_box_curve25519xsalsa20poly1305_beforenm(shared_k.ptr, bob_publickey.ptr, alice_secretkey.ptr) == 0);
91 }
92 
93 @safe
94 unittest
95 {
96   import std.stdio : writeln;
97   import wrapper.sodium.randombytes;
98   debug writeln("unittest block 2 from sodium.crypto_box_curve25519xsalsa20poly1305.d");
99 
100   ubyte[crypto_box_curve25519xsalsa20poly1305_SEEDBYTES] seed = void;
101   randombytes(seed);
102   ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES]  alice_publickey = void;
103   ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES]  alice_secretkey = void;
104   assert(crypto_box_curve25519xsalsa20poly1305_seed_keypair(alice_publickey, alice_secretkey, seed));
105 
106   ubyte[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES]  bob_publickey = void;
107   ubyte[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES]  bob_secretkey = void;
108   assert(crypto_box_curve25519xsalsa20poly1305_keypair(bob_publickey, bob_secretkey));
109 
110   ubyte[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES] shared_k = void;
111   assert(crypto_box_curve25519xsalsa20poly1305_beforenm(shared_k, bob_publickey, alice_secretkey));
112 }