PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::security::detail Namespace Reference

Functions

std::string base64_encode (const std::uint8_t *data, std::size_t size)
 Standard base64 encode (no line breaks)
 
bool base64_decode (const std::string &in, std::vector< std::uint8_t > &out)
 Standard base64 decode; returns false on malformed input.
 
bool hex_decode (const std::string &in, std::uint8_t *out, std::size_t out_size)
 Hex decode (lowercase or uppercase); returns false on malformed input.
 
bool constant_time_equal (const std::uint8_t *a, const std::uint8_t *b, std::size_t n) noexcept
 Constant-time equality on byte buffers of equal length.
 

Function Documentation

◆ base64_decode()

bool kcenon::pacs::security::detail::base64_decode ( const std::string & in,
std::vector< std::uint8_t > & out )
nodiscard

Standard base64 decode; returns false on malformed input.

Definition at line 89 of file audit_log_cipher.cpp.

89 {
90 if (in.size() % 4 != 0) return false;
91 out.clear();
92 out.reserve((in.size() / 4) * 3);
93
94 for (std::size_t i = 0; i < in.size(); i += 4) {
95 const char c0 = in[i];
96 const char c1 = in[i + 1];
97 const char c2 = in[i + 2];
98 const char c3 = in[i + 3];
99
100 const int v0 = base64_value(c0);
101 const int v1 = base64_value(c1);
102 if (v0 < 0 || v1 < 0) return false;
103
104 const std::uint32_t b0 = static_cast<std::uint32_t>(v0);
105 const std::uint32_t b1 = static_cast<std::uint32_t>(v1);
106
107 out.push_back(static_cast<std::uint8_t>((b0 << 2) | (b1 >> 4)));
108
109 if (c2 == '=') {
110 if (c3 != '=') return false;
111 if (i + 4 != in.size()) return false;
112 continue;
113 }
114 const int v2 = base64_value(c2);
115 if (v2 < 0) return false;
116 const std::uint32_t b2 = static_cast<std::uint32_t>(v2);
117
118 out.push_back(static_cast<std::uint8_t>(((b1 & 0xF) << 4) | (b2 >> 2)));
119
120 if (c3 == '=') {
121 if (i + 4 != in.size()) return false;
122 continue;
123 }
124 const int v3 = base64_value(c3);
125 if (v3 < 0) return false;
126 const std::uint32_t b3 = static_cast<std::uint32_t>(v3);
127 out.push_back(static_cast<std::uint8_t>(((b2 & 0x3) << 6) | b3));
128 }
129 return true;
130}
std::string out

References out.

Referenced by kcenon::pacs::security::audit_key_manager::decode_key().

Here is the caller graph for this function:

◆ base64_encode()

std::string kcenon::pacs::security::detail::base64_encode ( const std::uint8_t * data,
std::size_t size )
nodiscard

Standard base64 encode (no line breaks)

Definition at line 56 of file audit_log_cipher.cpp.

56 {
57 std::string out;
58 out.reserve(((size + 2) / 3) * 4);
59
60 std::size_t i = 0;
61 for (; i + 3 <= size; i += 3) {
62 std::uint32_t v = (static_cast<std::uint32_t>(data[i]) << 16) |
63 (static_cast<std::uint32_t>(data[i + 1]) << 8) |
64 static_cast<std::uint32_t>(data[i + 2]);
65 out.push_back(kBase64Alphabet[(v >> 18) & 0x3F]);
66 out.push_back(kBase64Alphabet[(v >> 12) & 0x3F]);
67 out.push_back(kBase64Alphabet[(v >> 6) & 0x3F]);
68 out.push_back(kBase64Alphabet[v & 0x3F]);
69 }
70
71 const std::size_t rem = size - i;
72 if (rem == 1) {
73 std::uint32_t v = static_cast<std::uint32_t>(data[i]) << 16;
74 out.push_back(kBase64Alphabet[(v >> 18) & 0x3F]);
75 out.push_back(kBase64Alphabet[(v >> 12) & 0x3F]);
76 out.push_back('=');
77 out.push_back('=');
78 } else if (rem == 2) {
79 std::uint32_t v = (static_cast<std::uint32_t>(data[i]) << 16) |
80 (static_cast<std::uint32_t>(data[i + 1]) << 8);
81 out.push_back(kBase64Alphabet[(v >> 18) & 0x3F]);
82 out.push_back(kBase64Alphabet[(v >> 12) & 0x3F]);
83 out.push_back(kBase64Alphabet[(v >> 6) & 0x3F]);
84 out.push_back('=');
85 }
86 return out;
87}

References out.

◆ constant_time_equal()

bool kcenon::pacs::security::detail::constant_time_equal ( const std::uint8_t * a,
const std::uint8_t * b,
std::size_t n )
nodiscardnoexcept

Constant-time equality on byte buffers of equal length.

Definition at line 145 of file audit_log_cipher.cpp.

147 {
148 std::uint8_t diff = 0;
149 for (std::size_t i = 0; i < n; ++i) {
150 diff |= static_cast<std::uint8_t>(a[i] ^ b[i]);
151 }
152 return diff == 0;
153}

◆ hex_decode()

bool kcenon::pacs::security::detail::hex_decode ( const std::string & in,
std::uint8_t * out,
std::size_t out_size )
nodiscard

Hex decode (lowercase or uppercase); returns false on malformed input.

Definition at line 132 of file audit_log_cipher.cpp.

134 {
135 if (in.size() != out_size * 2) return false;
136 for (std::size_t i = 0; i < out_size; ++i) {
137 const int hi = hex_value(in[2 * i]);
138 const int lo = hex_value(in[2 * i + 1]);
139 if (hi < 0 || lo < 0) return false;
140 out[i] = static_cast<std::uint8_t>((hi << 4) | lo);
141 }
142 return true;
143}

References out.

Referenced by kcenon::pacs::security::audit_key_manager::decode_key().

Here is the caller graph for this function: