Botan 2.19.1
Crypto and TLS for C&
datastor.cpp
Go to the documentation of this file.
1/*
2* Data Store
3* (C) 1999-2007 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/datastor.h>
9#include <botan/exceptn.h>
10#include <botan/parsing.h>
11#include <botan/hex.h>
12#include <botan/internal/stl_util.h>
13
14namespace Botan {
15
16/*
17* Data_Store Equality Comparison
18*/
19bool Data_Store::operator==(const Data_Store& other) const
20 {
21 return (m_contents == other.m_contents);
22 }
23
24/*
25* Check if this key has at least one value
26*/
27bool Data_Store::has_value(const std::string& key) const
28 {
29 return (m_contents.lower_bound(key) != m_contents.end());
30 }
31
32/*
33* Search based on an arbitrary predicate
34*/
35std::multimap<std::string, std::string> Data_Store::search_for(
36 std::function<bool (std::string, std::string)> predicate) const
37 {
38 std::multimap<std::string, std::string> out;
39
40 for(auto i = m_contents.begin(); i != m_contents.end(); ++i)
41 if(predicate(i->first, i->second))
42 out.insert(std::make_pair(i->first, i->second));
43
44 return out;
45 }
46
47/*
48* Search based on key equality
49*/
50std::vector<std::string> Data_Store::get(const std::string& looking_for) const
51 {
52 std::vector<std::string> out;
53 auto range = m_contents.equal_range(looking_for);
54 for(auto i = range.first; i != range.second; ++i)
55 out.push_back(i->second);
56 return out;
57 }
58
59/*
60* Get a single atom
61*/
62std::string Data_Store::get1(const std::string& key) const
63 {
64 std::vector<std::string> vals = get(key);
65
66 if(vals.empty())
67 throw Invalid_State("Data_Store::get1: No values set for " + key);
68 if(vals.size() > 1)
69 throw Invalid_State("Data_Store::get1: More than one value for " + key);
70
71 return vals[0];
72 }
73
74std::string Data_Store::get1(const std::string& key,
75 const std::string& default_value) const
76 {
77 std::vector<std::string> vals = get(key);
78
79 if(vals.size() > 1)
80 throw Invalid_State("Data_Store::get1: More than one value for " + key);
81
82 if(vals.empty())
83 return default_value;
84
85 return vals[0];
86 }
87
88/*
89* Get a single std::vector atom
90*/
91std::vector<uint8_t>
92Data_Store::get1_memvec(const std::string& key) const
93 {
94 std::vector<std::string> vals = get(key);
95
96 if(vals.empty())
97 return std::vector<uint8_t>();
98
99 if(vals.size() > 1)
100 throw Invalid_State("Data_Store::get1_memvec: Multiple values for " +
101 key);
102
103 return hex_decode(vals[0]);
104 }
105
106/*
107* Get a single uint32_t atom
108*/
109uint32_t Data_Store::get1_uint32(const std::string& key,
110 uint32_t default_val) const
111 {
112 std::vector<std::string> vals = get(key);
113
114 if(vals.empty())
115 return default_val;
116 else if(vals.size() > 1)
117 throw Invalid_State("Data_Store::get1_uint32: Multiple values for " + key);
118
119 return to_u32bit(vals[0]);
120 }
121
122/*
123* Insert a single key and value
124*/
125void Data_Store::add(const std::string& key, const std::string& val)
126 {
127 multimap_insert(m_contents, key, val);
128 }
129
130/*
131* Insert a single key and value
132*/
133void Data_Store::add(const std::string& key, uint32_t val)
134 {
135 add(key, std::to_string(val));
136 }
137
138/*
139* Insert a single key and value
140*/
141void Data_Store::add(const std::string& key, const secure_vector<uint8_t>& val)
142 {
143 add(key, hex_encode(val.data(), val.size()));
144 }
145
146void Data_Store::add(const std::string& key, const std::vector<uint8_t>& val)
147 {
148 add(key, hex_encode(val.data(), val.size()));
149 }
150
151/*
152* Insert a mapping of key/value pairs
153*/
154void Data_Store::add(const std::multimap<std::string, std::string>& in)
155 {
156 std::multimap<std::string, std::string>::const_iterator i = in.begin();
157 while(i != in.end())
158 {
159 m_contents.insert(*i);
160 ++i;
161 }
162 }
163
164/*
165* Create and populate a X509_DN
166*/
168 {
169 auto names = info.search_for(
170 [](const std::string& key, const std::string&)
171 {
172 return (key.find("X520.") != std::string::npos);
173 });
174
175 X509_DN dn;
176
177 for(auto i = names.begin(); i != names.end(); ++i)
178 dn.add_attribute(i->first, i->second);
179
180 return dn;
181 }
182
183/*
184* Create and populate an AlternativeName
185*/
187 {
188 auto names = info.search_for(
189 [](const std::string& key, const std::string&)
190 {
191 return (key == "RFC822" ||
192 key == "DNS" ||
193 key == "URI" ||
194 key == "IP");
195 });
196
197 AlternativeName alt_name;
198
199 for(auto i = names.begin(); i != names.end(); ++i)
200 alt_name.add_attribute(i->first, i->second);
201
202 return alt_name;
203 }
204
205}
void add_attribute(const std::string &type, const std::string &value)
uint32_t get1_uint32(const std::string &, uint32_t=0) const
Definition: datastor.cpp:109
std::multimap< std::string, std::string > search_for(std::function< bool(std::string, std::string)> predicate) const
Definition: datastor.cpp:35
std::vector< uint8_t > get1_memvec(const std::string &) const
Definition: datastor.cpp:92
void add(const std::multimap< std::string, std::string > &)
Definition: datastor.cpp:154
bool operator==(const Data_Store &) const
Definition: datastor.cpp:19
std::vector< std::string > get(const std::string &) const
Definition: datastor.cpp:50
bool has_value(const std::string &) const
Definition: datastor.cpp:27
std::string get1(const std::string &key) const
Definition: datastor.cpp:62
void add_attribute(const std::string &key, const std::string &val)
Definition: x509_dn.cpp:23
std::string to_string(const BER_Object &obj)
Definition: asn1_obj.cpp:213
Definition: alg_id.cpp:13
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition: hex.cpp:31
void multimap_insert(std::multimap< K, V > &multimap, const K &key, const V &value)
Definition: stl_util.h:76
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)
Definition: hex.cpp:89
X509_DN create_dn(const Data_Store &info)
Definition: datastor.cpp:167
AlternativeName create_alt_name(const Data_Store &info)
Definition: datastor.cpp:186
uint32_t to_u32bit(const std::string &str)
Definition: parsing.cpp:35
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65