Skip to content

Commit 97ab827

Browse files
committed
Add pure attribute and safe wrapper for generic hash
Hashing is pure (except for the key generation), and we can trivially wrap those function and provide safe alternatives.
1 parent 4dbddf4 commit 97ab827

File tree

1 file changed

+60
-23
lines changed

1 file changed

+60
-23
lines changed

source/libsodium/crypto_generichash.d

+60-23
Original file line numberDiff line numberDiff line change
@@ -16,56 +16,93 @@ import libsodium.crypto_generichash_blake2b;
1616
extern (C):
1717

1818
enum crypto_generichash_BYTES_MIN = crypto_generichash_blake2b_BYTES_MIN;
19-
size_t crypto_generichash_bytes_min ();
19+
size_t crypto_generichash_bytes_min () @safe pure;
2020

2121
enum crypto_generichash_BYTES_MAX = crypto_generichash_blake2b_BYTES_MAX;
22-
size_t crypto_generichash_bytes_max ();
22+
size_t crypto_generichash_bytes_max () @safe pure;
2323

2424
enum crypto_generichash_BYTES = crypto_generichash_blake2b_BYTES;
25-
size_t crypto_generichash_bytes ();
25+
size_t crypto_generichash_bytes () @safe pure;
2626

2727
enum crypto_generichash_KEYBYTES_MIN = crypto_generichash_blake2b_KEYBYTES_MIN;
28-
size_t crypto_generichash_keybytes_min ();
28+
size_t crypto_generichash_keybytes_min () @safe pure;
2929

3030
enum crypto_generichash_KEYBYTES_MAX = crypto_generichash_blake2b_KEYBYTES_MAX;
31-
size_t crypto_generichash_keybytes_max ();
31+
size_t crypto_generichash_keybytes_max () @safe pure;
3232

3333
enum crypto_generichash_KEYBYTES = crypto_generichash_blake2b_KEYBYTES;
34-
size_t crypto_generichash_keybytes ();
34+
size_t crypto_generichash_keybytes () @safe pure;
3535

3636
enum crypto_generichash_PRIMITIVE = "blake2b";
37-
const(char)* crypto_generichash_primitive ();
37+
const(char)* crypto_generichash_primitive () @safe pure;
3838

3939
/*
4040
* Important when writing bindings for other programming languages:
4141
* the state address should be 64-bytes aligned.
4242
*/
4343
alias crypto_generichash_state = crypto_generichash_blake2b_state;
4444

45-
size_t crypto_generichash_statebytes ();
45+
size_t crypto_generichash_statebytes () @safe pure;
4646

4747
int crypto_generichash (
48-
ubyte* out_,
48+
scope ubyte* out_,
4949
size_t outlen,
50-
const(ubyte)* in_,
50+
scope const(ubyte)* in_,
5151
ulong inlen,
52-
const(ubyte)* key,
53-
size_t keylen);
52+
scope const(ubyte)* key,
53+
size_t keylen) pure;
54+
55+
/// @safe wrapper around `crypto_generichash`
56+
extern(D) int crypto_generichash (
57+
scope ubyte[] out_,
58+
scope const ubyte[] in_,
59+
scope const ubyte[] key) @trusted pure
60+
{
61+
return crypto_generichash(
62+
out_.ptr, out_.length,
63+
in_.ptr, in_.length,
64+
key.ptr, key.length);
65+
}
5466

5567
int crypto_generichash_init (
56-
crypto_generichash_state* state,
57-
const(ubyte)* key,
68+
scope crypto_generichash_state* state,
69+
scope const(ubyte)* key,
5870
const size_t keylen,
59-
const size_t outlen);
71+
const size_t outlen) pure;
72+
73+
/// @safe wrapper around `crypto_generichash_init`
74+
extern(D) int crypto_generichash_init (
75+
scope ref crypto_generichash_state state,
76+
scope const(ubyte)[] key,
77+
size_t outlen) @trusted pure
78+
{
79+
return crypto_generichash_init(&state, key.ptr, key.length, outlen);
80+
}
6081

6182
int crypto_generichash_update (
62-
crypto_generichash_state* state,
63-
const(ubyte)* in_,
64-
ulong inlen);
83+
scope crypto_generichash_state* state,
84+
scope const(ubyte)* in_,
85+
ulong inlen) pure;
86+
87+
/// @safe wrapper around `crypto_generichash_update`
88+
extern(D) int crypto_generichash_update (
89+
scope ref crypto_generichash_state state,
90+
scope const(ubyte)[] in_) @trusted pure
91+
{
92+
return crypto_generichash_update(&state, in_.ptr, in_.length);
93+
}
6594

6695
int crypto_generichash_final (
67-
crypto_generichash_state* state,
68-
ubyte* out_,
69-
const size_t outlen);
70-
71-
void crypto_generichash_keygen (ref ubyte[crypto_generichash_KEYBYTES] k);
96+
scope crypto_generichash_state* state,
97+
scope ubyte* out_,
98+
const size_t outlen) pure;
99+
100+
/// @safe wrapper around `crypto_generichash_final`
101+
extern(D) int crypto_generichash_final (
102+
scope ref crypto_generichash_state state,
103+
scope ubyte[] out_) @trusted pure
104+
{
105+
return crypto_generichash_final(&state, out_.ptr, out_.length);
106+
}
107+
108+
void crypto_generichash_keygen (ref ubyte[crypto_generichash_KEYBYTES] k) @safe;

0 commit comments

Comments
 (0)