20
|
1 ???using System; |
|
2 |
|
3 namespace UCIS.NaCl.crypto_stream { |
|
4 static unsafe class xsalsa20 { |
|
5 public const int KEYBYTES = 32; |
|
6 public const int NONCEBYTES = 24; |
|
7 |
|
8 //Never written to |
|
9 static Byte[] sigma = new Byte[16] {(Byte)'e', (Byte)'x', (Byte)'p', (Byte)'a', //[16] = "expand 32-byte k"; |
|
10 (Byte)'n', (Byte)'d', (Byte)' ', (Byte)'3', |
|
11 (Byte)'2', (Byte)'-', (Byte)'b', (Byte)'y', |
|
12 (Byte)'t', (Byte)'e', (Byte)' ', (Byte)'k', }; |
|
13 |
|
14 public static void crypto_stream(Byte* c, int clen, Byte* n, Byte* k) { |
|
15 Byte* subkey = stackalloc Byte[32]; |
|
16 crypto_core.hsalsa20.crypto_core(subkey, n, k, sigma); |
|
17 salsa20.crypto_stream(c, clen, n + 16, subkey); |
|
18 } |
|
19 |
|
20 public static void crypto_stream_xor(Byte* c, Byte* m, UInt64 mlen, Byte* n, Byte* k) { |
|
21 Byte* subkey = stackalloc Byte[32]; |
|
22 crypto_core.hsalsa20.crypto_core(subkey, n, k, sigma); |
|
23 salsa20.crypto_stream_xor(c, m, (int)mlen, n + 16, subkey); |
|
24 } |
|
25 |
|
26 internal static void crypto_stream_xor_split(Byte* mcpad, int padbytes, Byte* c, Byte* m, UInt64 mlen, Byte* n, Byte* k) { |
|
27 Byte* subkey = stackalloc Byte[32]; |
|
28 crypto_core.hsalsa20.crypto_core(subkey, n, k, sigma); |
|
29 salsa20.crypto_stream_xor_split(mcpad, padbytes, c, m, (int)mlen, n + 16, subkey); |
|
30 } |
|
31 } |
|
32 } |