7#include <botan/sodium.h>
10#include <botan/exceptn.h>
11#include <botan/mem_ops.h>
17int sodium_aead_chacha20poly1305_encrypt(uint8_t ctext[],
18 unsigned long long* ctext_len,
19 const uint8_t ptext[],
23 const uint8_t nonce[],
25 const uint8_t key[]) {
28 chacha20poly1305->set_key(key, 32);
29 chacha20poly1305->set_associated_data(ad, ad_len);
30 chacha20poly1305->start(nonce, nonce_len);
34 buf.reserve(ptext_len + 16);
35 buf.assign(ptext, ptext + ptext_len);
37 chacha20poly1305->finish(buf);
39 copy_mem(ctext, buf.data(), buf.size());
40 if(ctext_len !=
nullptr) {
41 *ctext_len = buf.size();
46int sodium_aead_chacha20poly1305_decrypt(uint8_t ptext[],
47 unsigned long long* ptext_len,
48 const uint8_t ctext[],
52 const uint8_t nonce[],
54 const uint8_t key[]) {
59 if(ptext_len !=
nullptr) {
65 chacha20poly1305->set_key(key, 32);
66 chacha20poly1305->set_associated_data(ad, ad_len);
67 chacha20poly1305->start(nonce, nonce_len);
71 buf.assign(ctext, ctext + ctext_len);
74 chacha20poly1305->finish(buf);
79 if(ptext_len !=
nullptr) {
80 *ptext_len = ctext_len - 16;
83 copy_mem(ptext, buf.data(), buf.size());
87int sodium_aead_chacha20poly1305_encrypt_detached(uint8_t ctext[],
89 const uint8_t ptext[],
93 const uint8_t nonce[],
95 const uint8_t key[]) {
98 chacha20poly1305->set_key(key, 32);
99 chacha20poly1305->set_associated_data(ad, ad_len);
100 chacha20poly1305->start(nonce, nonce_len);
104 buf.reserve(ptext_len + 16);
105 buf.assign(ptext, ptext + ptext_len);
107 chacha20poly1305->finish(buf);
109 copy_mem(ctext, buf.data(), ptext_len);
110 copy_mem(mac, buf.data() + ptext_len, 16);
114int sodium_aead_chacha20poly1305_decrypt_detached(uint8_t ptext[],
115 const uint8_t ctext[],
120 const uint8_t nonce[],
122 const uint8_t key[]) {
125 chacha20poly1305->set_key(key, 32);
126 chacha20poly1305->set_associated_data(ad, ad_len);
127 chacha20poly1305->start(nonce, nonce_len);
131 buf.reserve(ctext_len + 16);
132 buf.assign(ctext, ctext + ctext_len);
133 buf.insert(buf.end(), mac, mac + 16);
136 chacha20poly1305->finish(buf);
141 copy_mem(ptext, buf.data(), buf.size());
148 unsigned long long* ctext_len,
149 const uint8_t ptext[],
153 const uint8_t unused_secret_nonce[],
154 const uint8_t nonce[],
155 const uint8_t key[]) {
158 return sodium_aead_chacha20poly1305_encrypt(
163 unsigned long long* ptext_len,
164 uint8_t unused_secret_nonce[],
165 const uint8_t ctext[],
169 const uint8_t nonce[],
170 const uint8_t key[]) {
173 return sodium_aead_chacha20poly1305_decrypt(
179 unsigned long long* mac_len,
180 const uint8_t ptext[],
184 const uint8_t unused_secret_nonce[],
185 const uint8_t nonce[],
186 const uint8_t key[]) {
189 if(mac_len !=
nullptr) {
193 return sodium_aead_chacha20poly1305_encrypt_detached(
198 uint8_t unused_secret_nonce[],
199 const uint8_t ctext[],
204 const uint8_t nonce[],
205 const uint8_t key[]) {
208 return sodium_aead_chacha20poly1305_decrypt_detached(
213 unsigned long long* ctext_len,
214 const uint8_t ptext[],
218 const uint8_t unused_secret_nonce[],
219 const uint8_t nonce[],
220 const uint8_t key[]) {
222 return sodium_aead_chacha20poly1305_encrypt(
227 unsigned long long* ptext_len,
228 uint8_t unused_secret_nonce[],
229 const uint8_t ctext[],
233 const uint8_t nonce[],
234 const uint8_t key[]) {
236 return sodium_aead_chacha20poly1305_decrypt(
242 unsigned long long* mac_len,
243 const uint8_t ptext[],
247 const uint8_t unused_secret_nonce[],
248 const uint8_t nonce[],
249 const uint8_t key[]) {
251 if(mac_len !=
nullptr) {
255 return sodium_aead_chacha20poly1305_encrypt_detached(
260 uint8_t unused_secret_nonce[],
261 const uint8_t ctext[],
266 const uint8_t nonce[],
267 const uint8_t key[]) {
270 return sodium_aead_chacha20poly1305_decrypt_detached(
275 unsigned long long* ctext_len,
276 const uint8_t ptext[],
280 const uint8_t unused_secret_nonce[],
281 const uint8_t nonce[],
282 const uint8_t key[]) {
285 return sodium_aead_chacha20poly1305_encrypt(
290 unsigned long long* ptext_len,
291 uint8_t unused_secret_nonce[],
292 const uint8_t ctext[],
296 const uint8_t nonce[],
297 const uint8_t key[]) {
300 return sodium_aead_chacha20poly1305_decrypt(
306 unsigned long long* mac_len,
307 const uint8_t ptext[],
311 const uint8_t unused_secret_nonce[],
312 const uint8_t nonce[],
313 const uint8_t key[]) {
315 if(mac_len !=
nullptr) {
319 return sodium_aead_chacha20poly1305_encrypt_detached(
324 uint8_t unused_secret_nonce[],
325 const uint8_t ctext[],
330 const uint8_t nonce[],
331 const uint8_t key[]) {
333 return sodium_aead_chacha20poly1305_decrypt_detached(
static std::unique_ptr< AEAD_Mode > create_or_throw(std::string_view algo, Cipher_Dir direction, std::string_view provider="")
int crypto_aead_xchacha20poly1305_ietf_decrypt(uint8_t ptext[], unsigned long long *ptext_len, uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
int crypto_aead_chacha20poly1305_decrypt(uint8_t m[], unsigned long long *ptext_len, uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
int crypto_aead_chacha20poly1305_decrypt_detached(uint8_t m[], uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t mac[], const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
int crypto_aead_chacha20poly1305_ietf_encrypt_detached(uint8_t ctext[], uint8_t mac[], unsigned long long *mac_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
size_t crypto_aead_chacha20poly1305_ietf_npubbytes()
int crypto_aead_chacha20poly1305_encrypt(uint8_t ctext[], unsigned long long *ctext_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
size_t crypto_aead_xchacha20poly1305_ietf_npubbytes()
int crypto_aead_chacha20poly1305_ietf_encrypt(uint8_t ctext[], unsigned long long *ctext_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
int crypto_aead_xchacha20poly1305_ietf_encrypt(uint8_t ctext[], unsigned long long *ctext_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
int crypto_aead_chacha20poly1305_ietf_decrypt(uint8_t ptext[], unsigned long long *ptext_len, uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
int crypto_aead_chacha20poly1305_encrypt_detached(uint8_t ctext[], uint8_t mac[], unsigned long long *mac_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(uint8_t ctext[], uint8_t mac[], unsigned long long *mac_len, const uint8_t ptext[], size_t ptext_len, const uint8_t ad[], size_t ad_len, const uint8_t unused_secret_nonce[], const uint8_t nonce[], const uint8_t key[])
size_t crypto_aead_chacha20poly1305_npubbytes()
int crypto_aead_chacha20poly1305_ietf_decrypt_detached(uint8_t m[], uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t mac[], const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(uint8_t ptext[], uint8_t unused_secret_nonce[], const uint8_t ctext[], size_t ctext_len, const uint8_t mac[], const uint8_t ad[], size_t ad_len, const uint8_t nonce[], const uint8_t key[])
constexpr void copy_mem(T *out, const T *in, size_t n)
std::vector< T, secure_allocator< T > > secure_vector