• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 5123321399

30 May 2023 04:06PM UTC coverage: 92.213% (+0.004%) from 92.209%
5123321399

Pull #3558

github

web-flow
Merge dd72f7389 into 057bcbc35
Pull Request #3558: Add braces around all if/else statements

75602 of 81986 relevant lines covered (92.21%)

11859779.3 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

75.36
/src/lib/compat/sodium/sodium_utils.cpp
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

9
#include <botan/mem_ops.h>
10
#include <botan/system_rng.h>
11
#include <botan/internal/chacha.h>
12
#include <botan/internal/ct_utils.h>
13
#include <botan/internal/loadstor.h>
14
#include <botan/internal/os_utils.h>
15
#include <cstdlib>
16

17
namespace Botan {
18

19
void Sodium::randombytes_buf(void* buf, size_t len) { system_rng().randomize(static_cast<uint8_t*>(buf), len); }
×
20

21
uint32_t Sodium::randombytes_uniform(uint32_t upper_bound) {
×
22
   if(upper_bound <= 1) {
×
23
      return 0;
24
   }
25

26
   // Not completely uniform
27
   uint64_t x;
×
28
   randombytes_buf(&x, sizeof(x));
×
29
   return x % upper_bound;
×
30
}
31

32
void Sodium::randombytes_buf_deterministic(void* buf, size_t size, const uint8_t seed[randombytes_SEEDBYTES]) {
1✔
33
   const unsigned char nonce[12] = {'L', 'i', 'b', 's', 'o', 'd', 'i', 'u', 'm', 'D', 'R', 'G'};
1✔
34

35
   ChaCha chacha(20);
1✔
36
   chacha.set_key(seed, randombytes_SEEDBYTES);
1✔
37
   chacha.set_iv(nonce, sizeof(nonce));
1✔
38
   chacha.write_keystream(static_cast<uint8_t*>(buf), size);
1✔
39
}
1✔
40

41
int Sodium::crypto_verify_16(const uint8_t x[16], const uint8_t y[16]) { return same_mem(x, y, 16); }
2✔
42

43
int Sodium::crypto_verify_32(const uint8_t x[32], const uint8_t y[32]) { return same_mem(x, y, 32); }
4✔
44

45
int Sodium::crypto_verify_64(const uint8_t x[64], const uint8_t y[64]) { return same_mem(x, y, 64); }
2✔
46

47
void Sodium::sodium_memzero(void* ptr, size_t len) { secure_scrub_memory(ptr, len); }
×
48

49
int Sodium::sodium_memcmp(const void* x, const void* y, size_t len) {
3✔
50
   const bool same = constant_time_compare(static_cast<const uint8_t*>(x), static_cast<const uint8_t*>(y), len);
3✔
51
   return same ? 0 : -1;
3✔
52
}
53

54
int Sodium::sodium_compare(const uint8_t x[], const uint8_t y[], size_t len) {
3✔
55
   const uint8_t LT = static_cast<uint8_t>(-1);
3✔
56
   const uint8_t EQ = 0;
3✔
57
   const uint8_t GT = 1;
3✔
58

59
   uint8_t result = EQ;  // until found otherwise
3✔
60

61
   for(size_t i = 0; i != len; ++i) {
18✔
62
      const auto is_eq = CT::Mask<uint8_t>::is_equal(x[i], y[i]);
15✔
63
      const auto is_lt = CT::Mask<uint8_t>::is_lt(x[i], y[i]);
15✔
64
      result = is_eq.select(result, is_lt.select(LT, GT));
15✔
65
   }
66

67
   return static_cast<int8_t>(result);
3✔
68
}
69

70
int Sodium::sodium_is_zero(const uint8_t b[], size_t len) {
3✔
71
   uint8_t sum = 0;
3✔
72
   for(size_t i = 0; i != len; ++i) {
13✔
73
      sum |= b[i];
10✔
74
   }
75
   return static_cast<int>(CT::Mask<uint8_t>::expand(sum).if_not_set_return(1));
3✔
76
}
77

78
void Sodium::sodium_increment(uint8_t b[], size_t len) {
3✔
79
   uint8_t carry = 1;
3✔
80
   for(size_t i = 0; i != len; ++i) {
18✔
81
      b[i] += carry;
15✔
82
      carry &= (b[i] == 0);
15✔
83
   }
84
}
3✔
85

86
void Sodium::sodium_add(uint8_t a[], const uint8_t b[], size_t len) {
4✔
87
   uint8_t carry = 0;
4✔
88
   for(size_t i = 0; i != len; ++i) {
24✔
89
      a[i] += b[i] + carry;
20✔
90
      carry = (a[i] < b[i]);
20✔
91
   }
92
}
4✔
93

94
void* Sodium::sodium_malloc(size_t size) {
1✔
95
   const uint64_t len = size;
1✔
96

97
   if(size + sizeof(len) < size) {
1✔
98
      return nullptr;
99
   }
100

101
   // NOLINTNEXTLINE(*-no-malloc)
102
   uint8_t* p = static_cast<uint8_t*>(std::calloc(size + sizeof(len), 1));
1✔
103
   store_le(len, p);
1✔
104
   return p + 8;
1✔
105
}
106

107
void Sodium::sodium_free(void* ptr) {
2✔
108
   if(ptr == nullptr) {
2✔
109
      return;
110
   }
111

112
   uint8_t* p = static_cast<uint8_t*>(ptr) - 8;
1✔
113
   const uint64_t len = load_le<uint64_t>(p, 0);
1✔
114
   secure_scrub_memory(ptr, static_cast<size_t>(len));
1✔
115
   // NOLINTNEXTLINE(*-no-malloc)
116
   std::free(p);
1✔
117
}
118

119
void* Sodium::sodium_allocarray(size_t count, size_t size) {
×
120
   const size_t bytes = count * size;
×
121
   if(bytes < count || bytes < size) {
×
122
      return nullptr;
123
   }
124
   return sodium_malloc(bytes);
×
125
}
126

127
int Sodium::sodium_mprotect_noaccess(void* ptr) {
×
128
   OS::page_prohibit_access(ptr);
×
129
   return 0;
×
130
}
131

132
int Sodium::sodium_mprotect_readwrite(void* ptr) {
×
133
   OS::page_allow_access(ptr);
×
134
   return 0;
×
135
}
136

137
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc