1 #ifndef crypto_secretstream_xchacha20poly1305_H
2 #define crypto_secretstream_xchacha20poly1305_H
3 
4 #include <stddef.h>
5 
6 #include "crypto_aead_xchacha20poly1305.h"
7 #include "crypto_stream_chacha20.h"
8 #include "export.h"
9 
10 #ifdef __cplusplus
11 # ifdef __GNUC__
12 #  pragma GCC diagnostic ignored "-Wlong-long"
13 # endif
14 extern "C" {
15 #endif
16 
17 #define crypto_secretstream_xchacha20poly1305_ABYTES \
18     (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES)
19 SODIUM_EXPORT
20 size_t crypto_secretstream_xchacha20poly1305_abytes(void);
21 
22 #define crypto_secretstream_xchacha20poly1305_HEADERBYTES \
23     crypto_aead_xchacha20poly1305_ietf_NPUBBYTES
24 SODIUM_EXPORT
25 size_t crypto_secretstream_xchacha20poly1305_headerbytes(void);
26 
27 #define crypto_secretstream_xchacha20poly1305_KEYBYTES \
28     crypto_aead_xchacha20poly1305_ietf_KEYBYTES
29 SODIUM_EXPORT
30 size_t crypto_secretstream_xchacha20poly1305_keybytes(void);
31 
32 #define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \
33     SODIUM_MIN(SODIUM_SIZE_MAX, ((1ULL << 32) - 2ULL) * 64ULL)
34 SODIUM_EXPORT
35 size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void);
36 
37 #define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00
38 SODIUM_EXPORT
39 unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void);
40 
41 #define crypto_secretstream_xchacha20poly1305_TAG_PUSH    0x01
42 SODIUM_EXPORT
43 unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void);
44 
45 #define crypto_secretstream_xchacha20poly1305_TAG_REKEY   0x02
46 SODIUM_EXPORT
47 unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void);
48 
49 #define crypto_secretstream_xchacha20poly1305_TAG_FINAL \
50     (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \
51      crypto_secretstream_xchacha20poly1305_TAG_REKEY)
52 SODIUM_EXPORT
53 unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void);
54 
55 typedef struct crypto_secretstream_xchacha20poly1305_state {
56     unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES];
57     unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES];
58     unsigned char _pad[8];
59 } crypto_secretstream_xchacha20poly1305_state;
60 
61 SODIUM_EXPORT
62 size_t crypto_secretstream_xchacha20poly1305_statebytes(void);
63 
64 SODIUM_EXPORT
65 void crypto_secretstream_xchacha20poly1305_keygen
66    (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]);
67 
68 SODIUM_EXPORT
69 int crypto_secretstream_xchacha20poly1305_init_push
70    (crypto_secretstream_xchacha20poly1305_state *state,
71     unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES],
72     const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]);
73 
74 SODIUM_EXPORT
75 int crypto_secretstream_xchacha20poly1305_push
76    (crypto_secretstream_xchacha20poly1305_state *state,
77     unsigned char *c, unsigned long long *clen_p,
78     const unsigned char *m, unsigned long long mlen,
79     const unsigned char *ad, unsigned long long adlen, unsigned char tag);
80 
81 SODIUM_EXPORT
82 int crypto_secretstream_xchacha20poly1305_init_pull
83    (crypto_secretstream_xchacha20poly1305_state *state,
84     const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES],
85     const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]);
86 
87 SODIUM_EXPORT
88 int crypto_secretstream_xchacha20poly1305_pull
89    (crypto_secretstream_xchacha20poly1305_state *state,
90     unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p,
91     const unsigned char *c, unsigned long long clen,
92     const unsigned char *ad, unsigned long long adlen);
93 
94 SODIUM_EXPORT
95 void crypto_secretstream_xchacha20poly1305_rekey
96     (crypto_secretstream_xchacha20poly1305_state *state);
97 
98 #ifdef __cplusplus
99 }
100 #endif
101 
102 #endif
103