Botan  2.19.1
Crypto and TLS for C++11
sodium_box.cpp
Go to the documentation of this file.
1 /*
2 * (C) 2019 Jack Lloyd
3 *
4 * Botan is released under the Simplified BSD License (see license.txt)
5 */
6 
7 #include <botan/sodium.h>
8 #include <botan/secmem.h>
9 
10 namespace Botan {
11 
13  uint8_t sk[32],
14  const uint8_t seed[32])
15  {
16  secure_vector<uint8_t> digest(64);
17  crypto_hash_sha512(digest.data(), seed, 32);
18  copy_mem(sk, digest.data(), 32);
19  return crypto_scalarmult_curve25519_base(pk, sk);
20  }
21 
23  uint8_t sk[32])
24  {
25  randombytes_buf(sk, 32);
26  return crypto_scalarmult_curve25519_base(pk, sk);
27  }
28 
30  const uint8_t pk[32],
31  const uint8_t sk[32])
32  {
33  const uint8_t zero[16] = { 0 };
34  secure_vector<uint8_t> shared(32);
35 
36  if(crypto_scalarmult_curve25519(shared.data(), sk, pk) != 0)
37  return -1;
38 
39  return crypto_core_hsalsa20(key, zero, shared.data(), nullptr);
40  }
41 
43  const uint8_t ptext[],
44  size_t ptext_len,
45  const uint8_t nonce[],
46  const uint8_t pk[32],
47  const uint8_t sk[32])
48  {
49  secure_vector<uint8_t> shared(32);
50 
51  if(crypto_box_curve25519xsalsa20poly1305_beforenm(shared.data(), pk, sk) != 0)
52  return -1;
53 
54  return crypto_box_curve25519xsalsa20poly1305_afternm(ctext, ptext, ptext_len, nonce, shared.data());
55  }
56 
58  const uint8_t ctext[],
59  size_t ctext_len,
60  const uint8_t nonce[],
61  const uint8_t pk[32],
62  const uint8_t sk[32])
63  {
64  secure_vector<uint8_t> shared(32);
65 
66  if(crypto_box_curve25519xsalsa20poly1305_beforenm(shared.data(), pk, sk) != 0)
67  return -1;
68 
69  return crypto_box_curve25519xsalsa20poly1305_open_afternm(ptext, ctext, ctext_len, nonce, shared.data());
70  }
71 
72 int Sodium::crypto_box_detached(uint8_t ctext[], uint8_t mac[],
73  const uint8_t ptext[], size_t ptext_len,
74  const uint8_t nonce[], const uint8_t pk[32],
75  const uint8_t sk[32])
76  {
77  secure_vector<uint8_t> shared(32);
78 
79  if(crypto_box_beforenm(shared.data(), pk, sk) != 0)
80  return -1;
81 
82  return crypto_box_detached_afternm(ctext, mac, ptext, ptext_len, nonce, shared.data());
83  }
84 
85 int Sodium::crypto_box_open_detached(uint8_t ptext[], const uint8_t ctext[],
86  const uint8_t mac[],
87  size_t ctext_len,
88  const uint8_t nonce[],
89  const uint8_t pk[32],
90  const uint8_t sk[32])
91  {
92  secure_vector<uint8_t> shared(32);
93 
94  if(crypto_box_beforenm(shared.data(), pk, sk) != 0)
95  return -1;
96 
97  return crypto_box_open_detached_afternm(ptext, ctext, mac, ctext_len, nonce, shared.data());
98  }
99 
100 }
int crypto_core_hsalsa20(uint8_t out[], const uint8_t in[], const uint8_t key[], const uint8_t c[])
int crypto_box_curve25519xsalsa20poly1305(uint8_t ctext[], const uint8_t ptext[], size_t ptext_len, const uint8_t nonce[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium_box.cpp:42
int crypto_box_open_detached(uint8_t ptext[], const uint8_t ctext[], const uint8_t mac[], size_t ctext_len, const uint8_t nonce[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium_box.cpp:85
int crypto_box_open_detached_afternm(uint8_t ptext[], const uint8_t ctext[], const uint8_t mac[], size_t ctext_len, const uint8_t nonce[], const uint8_t key[])
Definition: sodium.h:799
int crypto_box_curve25519xsalsa20poly1305_keypair(uint8_t pk[32], uint8_t sk[32])
Definition: sodium_box.cpp:22
int crypto_hash_sha512(uint8_t out[64], const uint8_t in[], size_t in_len)
Definition: sodium_auth.cpp:13
int crypto_scalarmult_curve25519(uint8_t out[32], const uint8_t scalar[32], const uint8_t basepoint[32])
int crypto_scalarmult_curve25519_base(uint8_t out[32], const uint8_t scalar[32])
void randombytes_buf(void *buf, size_t size)
std::vector< T, secure_allocator< T >> secure_vector
Definition: secmem.h:65
int crypto_box_detached(uint8_t ctext[], uint8_t mac[], const uint8_t ptext[], size_t ptext_len, const uint8_t nonce[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium_box.cpp:72
int crypto_box_beforenm(uint8_t key[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium.h:779
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:133
Definition: alg_id.cpp:13
int crypto_box_detached_afternm(uint8_t ctext[], uint8_t mac[], const uint8_t ptext[], size_t ptext_len, const uint8_t nonce[], const uint8_t key[])
Definition: sodium.h:821
int crypto_box_curve25519xsalsa20poly1305_open_afternm(uint8_t ptext[], const uint8_t ctext[], size_t ctext_len, const uint8_t nonce[], const uint8_t key[])
Definition: sodium.h:685
int crypto_box_curve25519xsalsa20poly1305_afternm(uint8_t ctext[], const uint8_t ptext[], size_t ptext_len, const uint8_t nonce[], const uint8_t key[])
Definition: sodium.h:676
int crypto_box_curve25519xsalsa20poly1305_open(uint8_t ptext[], const uint8_t ctext[], size_t ctext_len, const uint8_t nonce[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium_box.cpp:57
int crypto_box_curve25519xsalsa20poly1305_seed_keypair(uint8_t pk[32], uint8_t sk[32], const uint8_t seed[32])
Definition: sodium_box.cpp:12
int crypto_box_curve25519xsalsa20poly1305_beforenm(uint8_t key[], const uint8_t pk[32], const uint8_t sk[32])
Definition: sodium_box.cpp:29