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 - crypto_secretstream_xchacha20poly1305_ABYTES, \ 34 (64ULL * ((1ULL << 32) - 2ULL))) 35 SODIUM_EXPORT 36 size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); 37 38 #define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 39 SODIUM_EXPORT 40 unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); 41 42 #define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 43 SODIUM_EXPORT 44 unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); 45 46 #define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 47 SODIUM_EXPORT 48 unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); 49 50 #define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ 51 (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ 52 crypto_secretstream_xchacha20poly1305_TAG_REKEY) 53 SODIUM_EXPORT 54 unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); 55 56 typedef struct crypto_secretstream_xchacha20poly1305_state { 57 unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; 58 unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; 59 unsigned char _pad[8]; 60 } crypto_secretstream_xchacha20poly1305_state; 61 62 SODIUM_EXPORT 63 size_t crypto_secretstream_xchacha20poly1305_statebytes(void); 64 65 SODIUM_EXPORT 66 void crypto_secretstream_xchacha20poly1305_keygen 67 (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) 68 __attribute__ ((nonnull)); 69 70 SODIUM_EXPORT 71 int crypto_secretstream_xchacha20poly1305_init_push 72 (crypto_secretstream_xchacha20poly1305_state *state, 73 unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], 74 const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) 75 __attribute__ ((nonnull)); 76 77 SODIUM_EXPORT 78 int crypto_secretstream_xchacha20poly1305_push 79 (crypto_secretstream_xchacha20poly1305_state *state, 80 unsigned char *c, unsigned long long *clen_p, 81 const unsigned char *m, unsigned long long mlen, 82 const unsigned char *ad, unsigned long long adlen, unsigned char tag) 83 __attribute__ ((nonnull(1))); 84 85 SODIUM_EXPORT 86 int crypto_secretstream_xchacha20poly1305_init_pull 87 (crypto_secretstream_xchacha20poly1305_state *state, 88 const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], 89 const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) 90 __attribute__ ((nonnull)); 91 92 SODIUM_EXPORT 93 int crypto_secretstream_xchacha20poly1305_pull 94 (crypto_secretstream_xchacha20poly1305_state *state, 95 unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, 96 const unsigned char *c, unsigned long long clen, 97 const unsigned char *ad, unsigned long long adlen) 98 __attribute__ ((nonnull(1))); 99 100 SODIUM_EXPORT 101 void crypto_secretstream_xchacha20poly1305_rekey 102 (crypto_secretstream_xchacha20poly1305_state *state); 103 104 #ifdef __cplusplus 105 } 106 #endif 107 108 #endif 109