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[]) {
63 chacha20poly1305->set_key(key, 32);
64 chacha20poly1305->set_associated_data(ad, ad_len);
65 chacha20poly1305->start(nonce, nonce_len);
69 buf.assign(ctext, ctext + ctext_len);
72 chacha20poly1305->finish(buf);
77 *ptext_len = ctext_len - 16;
79 copy_mem(ptext, buf.data(), buf.size());
83int sodium_aead_chacha20poly1305_encrypt_detached(uint8_t ctext[],
85 const uint8_t ptext[],
89 const uint8_t nonce[],
91 const uint8_t key[]) {
94 chacha20poly1305->set_key(key, 32);
95 chacha20poly1305->set_associated_data(ad, ad_len);
96 chacha20poly1305->start(nonce, nonce_len);
100 buf.reserve(ptext_len + 16);
101 buf.assign(ptext, ptext + ptext_len);
103 chacha20poly1305->finish(buf);
105 copy_mem(ctext, buf.data(), ptext_len);
106 copy_mem(mac, buf.data() + ptext_len, 16);
110int sodium_aead_chacha20poly1305_decrypt_detached(uint8_t ptext[],
111 const uint8_t ctext[],
116 const uint8_t nonce[],
118 const uint8_t key[]) {
121 chacha20poly1305->set_key(key, 32);
122 chacha20poly1305->set_associated_data(ad, ad_len);
123 chacha20poly1305->start(nonce, nonce_len);
127 buf.reserve(ctext_len + 16);
128 buf.assign(ctext, ctext + ctext_len);
129 buf.insert(buf.end(), mac, mac + 16);
132 chacha20poly1305->finish(buf);
137 copy_mem(ptext, buf.data(), buf.size());
144 unsigned long long* ctext_len,
145 const uint8_t ptext[],
149 const uint8_t unused_secret_nonce[],
150 const uint8_t nonce[],
151 const uint8_t key[]) {
154 return sodium_aead_chacha20poly1305_encrypt(
159 unsigned long long* ptext_len,
160 uint8_t unused_secret_nonce[],
161 const uint8_t ctext[],
165 const uint8_t nonce[],
166 const uint8_t key[]) {
169 return sodium_aead_chacha20poly1305_decrypt(
175 unsigned long long* mac_len,
176 const uint8_t ptext[],
180 const uint8_t unused_secret_nonce[],
181 const uint8_t nonce[],
182 const uint8_t key[]) {
185 if(mac_len !=
nullptr) {
189 return sodium_aead_chacha20poly1305_encrypt_detached(
194 uint8_t unused_secret_nonce[],
195 const uint8_t ctext[],
200 const uint8_t nonce[],
201 const uint8_t key[]) {
204 return sodium_aead_chacha20poly1305_decrypt_detached(
209 unsigned long long* ctext_len,
210 const uint8_t ptext[],
214 const uint8_t unused_secret_nonce[],
215 const uint8_t nonce[],
216 const uint8_t key[]) {
218 return sodium_aead_chacha20poly1305_encrypt(
223 unsigned long long* ptext_len,
224 uint8_t unused_secret_nonce[],
225 const uint8_t ctext[],
229 const uint8_t nonce[],
230 const uint8_t key[]) {
232 return sodium_aead_chacha20poly1305_decrypt(
238 unsigned long long* mac_len,
239 const uint8_t ptext[],
243 const uint8_t unused_secret_nonce[],
244 const uint8_t nonce[],
245 const uint8_t key[]) {
247 if(mac_len !=
nullptr) {
251 return sodium_aead_chacha20poly1305_encrypt_detached(
256 uint8_t unused_secret_nonce[],
257 const uint8_t ctext[],
262 const uint8_t nonce[],
263 const uint8_t key[]) {
266 return sodium_aead_chacha20poly1305_decrypt_detached(
271 unsigned long long* ctext_len,
272 const uint8_t ptext[],
276 const uint8_t unused_secret_nonce[],
277 const uint8_t nonce[],
278 const uint8_t key[]) {
281 return sodium_aead_chacha20poly1305_encrypt(
286 unsigned long long* ptext_len,
287 uint8_t unused_secret_nonce[],
288 const uint8_t ctext[],
292 const uint8_t nonce[],
293 const uint8_t key[]) {
296 return sodium_aead_chacha20poly1305_decrypt(
302 unsigned long long* mac_len,
303 const uint8_t ptext[],
307 const uint8_t unused_secret_nonce[],
308 const uint8_t nonce[],
309 const uint8_t key[]) {
311 if(mac_len !=
nullptr) {
315 return sodium_aead_chacha20poly1305_encrypt_detached(
320 uint8_t unused_secret_nonce[],
321 const uint8_t ctext[],
326 const uint8_t nonce[],
327 const uint8_t key[]) {
329 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