Coverage Report

Created: 2024-06-28 06:39

/src/botan/src/lib/base/symkey.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* OctetString
3
* (C) 1999-2007 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/symkey.h>
9
10
#include <botan/hex.h>
11
#include <botan/mem_ops.h>
12
#include <botan/rng.h>
13
#include <algorithm>
14
15
namespace Botan {
16
17
/*
18
* Create an OctetString from RNG output
19
*/
20
0
OctetString::OctetString(RandomNumberGenerator& rng, size_t len) {
21
0
   rng.random_vec(m_data, len);
22
0
}
23
24
/*
25
* Create an OctetString from a hex string
26
*/
27
0
OctetString::OctetString(std::string_view hex_string) {
28
0
   if(!hex_string.empty()) {
29
0
      m_data.resize(1 + hex_string.length() / 2);
30
0
      m_data.resize(hex_decode(m_data.data(), hex_string));
31
0
   }
32
0
}
33
34
/*
35
* Create an OctetString from a byte string
36
*/
37
32.0k
OctetString::OctetString(const uint8_t in[], size_t n) {
38
32.0k
   m_data.assign(in, in + n);
39
32.0k
}
40
41
namespace {
42
43
0
uint8_t odd_parity_of(uint8_t x) {
44
0
   uint8_t f = x | 0x01;
45
0
   f ^= (f >> 4);
46
0
   f ^= (f >> 2);
47
0
   f ^= (f >> 1);
48
49
0
   return (x & 0xFE) ^ (f & 0x01);
50
0
}
51
52
}  // namespace
53
54
/*
55
* Set the parity of each key byte to odd
56
*/
57
0
void OctetString::set_odd_parity() {
58
0
   for(size_t j = 0; j != m_data.size(); ++j) {
59
0
      m_data[j] = odd_parity_of(m_data[j]);
60
0
   }
61
0
}
62
63
/*
64
* Hex encode an OctetString
65
*/
66
0
std::string OctetString::to_string() const {
67
0
   return hex_encode(m_data.data(), m_data.size());
68
0
}
69
70
/*
71
* XOR Operation for OctetStrings
72
*/
73
0
OctetString& OctetString::operator^=(const OctetString& k) {
74
0
   if(&k == this) {
75
0
      zeroise(m_data);
76
0
      return (*this);
77
0
   }
78
0
   xor_buf(m_data.data(), k.begin(), std::min(length(), k.length()));
79
0
   return (*this);
80
0
}
81
82
/*
83
* Equality Operation for OctetStrings
84
*/
85
0
bool operator==(const OctetString& s1, const OctetString& s2) {
86
0
   return (s1.bits_of() == s2.bits_of());
87
0
}
88
89
/*
90
* Unequality Operation for OctetStrings
91
*/
92
0
bool operator!=(const OctetString& s1, const OctetString& s2) {
93
0
   return !(s1 == s2);
94
0
}
95
96
/*
97
* Append Operation for OctetStrings
98
*/
99
0
OctetString operator+(const OctetString& k1, const OctetString& k2) {
100
0
   secure_vector<uint8_t> out;
101
0
   out += k1.bits_of();
102
0
   out += k2.bits_of();
103
0
   return OctetString(out);
104
0
}
105
106
/*
107
* XOR Operation for OctetStrings
108
*/
109
0
OctetString operator^(const OctetString& k1, const OctetString& k2) {
110
0
   secure_vector<uint8_t> out(std::max(k1.length(), k2.length()));
111
112
0
   copy_mem(out.data(), k1.begin(), k1.length());
113
0
   xor_buf(out.data(), k2.begin(), k2.length());
114
0
   return OctetString(out);
115
0
}
116
117
}  // namespace Botan