Botan 2.1.0 Crypto and TLS for C++11

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

p11_object.cpp
Go to the documentation of this file.
1 /*
2 * PKCS#11 Object
3 * (C) 2016 Daniel Neus, Sirrix AG
4 * (C) 2016 Philipp Weber, Sirrix AG
5 *
6 * Botan is released under the Simplified BSD License (see license.txt)
7 */
8
9 #include <botan/p11_object.h>
10
11 #include <map>
12
13 namespace Botan {
14
15 namespace PKCS11 {
16
17 AttributeContainer::AttributeContainer(ObjectClass object_class)
18 {
19 add_class(object_class);
20 }
21
22 void AttributeContainer::add_class(ObjectClass object_class)
23 {
24 m_numerics.push_back(static_cast< uint64_t >(object_class));
25 add_attribute(AttributeType::Class, reinterpret_cast< uint8_t* >(&m_numerics.back()), sizeof(ObjectClass));
26 }
27
28 void AttributeContainer::add_string(AttributeType attribute, const std::string& value)
29 {
30 m_strings.push_back(value);
31 add_attribute(attribute, reinterpret_cast< const uint8_t* >(m_strings.back().data()), value.size());
32 }
33
34 void AttributeContainer::add_binary(AttributeType attribute, const uint8_t* value, size_t length)
35 {
36 m_vectors.push_back(secure_vector<uint8_t>(value, value + length));
37 add_attribute(attribute, reinterpret_cast< const uint8_t* >(m_vectors.back().data()), length);
38 }
39
40 void AttributeContainer::add_bool(AttributeType attribute, bool value)
41 {
42 m_numerics.push_back(value ? True : False);
43 add_attribute(attribute, reinterpret_cast< uint8_t* >(&m_numerics.back()), sizeof(Bbool));
44 }
45
46 void AttributeContainer::add_attribute(AttributeType attribute, const uint8_t* value, uint32_t size)
47 {
48 bool exists = false;
49 // check if the attribute has been added already
50 for(auto& existing_attribute : m_attributes)
51 {
52 if(existing_attribute.type == static_cast< CK_ATTRIBUTE_TYPE >(attribute))
53 {
54 // remove old entries
55 m_strings.erase(std::remove_if(m_strings.begin(), m_strings.end(), [ &existing_attribute ](const std::string& data)
56 {
57 return data.data() == existing_attribute.pValue;
58 }), m_strings.end());
59
60 m_numerics.erase(std::remove_if(m_numerics.begin(), m_numerics.end(), [ &existing_attribute ](const uint64_t& data)
61 {
62 return &data == existing_attribute.pValue;
63 }), m_numerics.end());
64
65 m_vectors.erase(std::remove_if(m_vectors.begin(),
66 m_vectors.end(), [ &existing_attribute ](const secure_vector<uint8_t>& data)
67 {
68 return data.data() == existing_attribute.pValue;
69 }), m_vectors.end());
70
71 existing_attribute.pValue = const_cast< uint8_t* >(value);
72 existing_attribute.ulValueLen = size;
73 exists = true;
74 break;
75 }
76 }
77
78 if(!exists)
79 {
80 m_attributes.push_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(attribute), const_cast< uint8_t* >(value), size });
81 }
82 }
83
84 // ====================================================================================================
85
86 ObjectFinder::ObjectFinder(Session& session, const std::vector<Attribute>& search_template)
87 : m_session(session), m_search_terminated(false)
88 {
89 module()->C_FindObjectsInit(m_session.get().handle(), const_cast< Attribute* >(search_template.data()),
90 search_template.size());
91 }
92
93 ObjectFinder::~ObjectFinder() BOTAN_NOEXCEPT
94 {
95 try
96 {
97 if(m_search_terminated == false)
98 {
99 module()->C_FindObjectsFinal(m_session.get().handle(), nullptr);
100 }
101 }
102 catch(...)
103 {
104 // ignore error during noexcept function
105 }
106 }
107
108 std::vector<ObjectHandle> ObjectFinder::find(uint32_t max_count) const
109 {
110 std::vector<ObjectHandle> result(max_count);
111 Ulong objectCount = 0;
112 module()->C_FindObjects(m_session.get().handle(), result.data(), max_count, &objectCount);
113 if(objectCount < max_count)
114 {
115 result.resize(objectCount);
116 }
117 return result;
118 }
119
120 void ObjectFinder::finish()
121 {
122 module()->C_FindObjectsFinal(m_session.get().handle());
123 m_search_terminated = true;
124 }
125
126 // ====================================================================================================
127
128 ObjectProperties::ObjectProperties(ObjectClass object_class)
129 : AttributeContainer(object_class), m_object_class(object_class)
130 {}
131
132 // ====================================================================================================
133
134 StorageObjectProperties::StorageObjectProperties(ObjectClass object_class)
135 : ObjectProperties(object_class)
136 {}
137
138 // ====================================================================================================
139
140 DataObjectProperties::DataObjectProperties()
141 : StorageObjectProperties(ObjectClass::Data)
142 {}
143
144 // ====================================================================================================
145
146 CertificateProperties::CertificateProperties(CertificateType cert_type)
147 : StorageObjectProperties(ObjectClass::Certificate), m_cert_type(cert_type)
148 {
149 add_numeric(AttributeType::CertificateType, static_cast< CK_CERTIFICATE_TYPE >(m_cert_type));
150 }
151
152 // ====================================================================================================
153
154 KeyProperties::KeyProperties(ObjectClass object_class, KeyType key_type)
155 : StorageObjectProperties(object_class), m_key_type(key_type)
156 {
157 add_numeric(AttributeType::KeyType, static_cast< CK_ULONG >(m_key_type));
158 }
159
160 // ====================================================================================================
161
162 PublicKeyProperties::PublicKeyProperties(KeyType key_type)
163 : KeyProperties(ObjectClass::PublicKey, key_type)
164 {}
165
166 // ====================================================================================================
167
168 PrivateKeyProperties::PrivateKeyProperties(KeyType key_type)
169 : KeyProperties(ObjectClass::PrivateKey, key_type)
170 {}
171
172 // ====================================================================================================
173
174 SecretKeyProperties::SecretKeyProperties(KeyType key_type)
175 : KeyProperties(ObjectClass::SecretKey, key_type)
176 {}
177
178 // ====================================================================================================
179
180 DomainParameterProperties::DomainParameterProperties(KeyType key_type)
181 : StorageObjectProperties(ObjectClass::DomainParameters), m_key_type(key_type)
182 {
183 add_numeric(AttributeType::KeyType, static_cast< CK_ULONG >(m_key_type));
184 }
185
186 // ====================================================================================================
187
188 Object::Object(Session& session, ObjectHandle handle)
189 : m_session(session), m_handle(handle)
190 {}
191
192 Object::Object(Session& session, const ObjectProperties& obj_props)
193 : m_session(session), m_handle(0)
194 {
195 m_session.get().module()->C_CreateObject(m_session.get().handle(), obj_props.data(), obj_props.count(), &m_handle);
196 }
197
198 secure_vector<uint8_t> Object::get_attribute_value(AttributeType attribute) const
199 {
200 std::map<AttributeType, secure_vector<uint8_t>> attribute_map = { { attribute, secure_vector<uint8_t>() } };
201 module()->C_GetAttributeValue(m_session.get().handle(), m_handle, attribute_map);
202 return attribute_map.at(attribute);
203 }
204
205 void Object::set_attribute_value(AttributeType attribute, const secure_vector<uint8_t>& value) const
206 {
207 std::map<AttributeType, secure_vector<uint8_t>> attribute_map = { { attribute, value } };
208 module()->C_SetAttributeValue(m_session.get().handle(), m_handle, attribute_map);
209 }
210
211 void Object::destroy() const
212 {
213 module()->C_DestroyObject(m_session.get().handle(), m_handle);
214 }
215
216 ObjectHandle Object::copy(const AttributeContainer& modified_attributes) const
217 {
218 ObjectHandle copied_handle;
219 module()->C_CopyObject(m_session.get().handle(), m_handle, modified_attributes.data(), modified_attributes.count(),
220 &copied_handle);
221 return copied_handle;
222 }
223 }
224 }
Botan::PKCS11::ObjectProperties
Common attributes of all objects.
Definition: p11_object.h:176
Botan::PKCS11::ObjectClass::DomainParameters
Botan::PKCS11::ObjectFinder::~ObjectFinder
~ObjectFinder() BOTAN_NOEXCEPT
Terminates a search for token and session objects (calls C_FindObjectsFinal)
Definition: p11_object.cpp:93
Botan::PKCS11::ObjectClass::PublicKey
Botan::PKCS11::ObjectFinder::module
Module & module() const
Definition: p11_object.h:165
Botan::PKCS11::CertificateType
CertificateType
Definition: p11.h:175
Botan::PKCS11::AttributeType
AttributeType
Definition: p11.h:63
Botan::PKCS11::ObjectFinder::finish
void finish()
Finishes the search operation manually to allow a new ObjectFinder to exist.
Definition: p11_object.cpp:120
Botan::PKCS11::Ulong
CK_ULONG Ulong
Definition: p11.h:836
Botan::PKCS11::LowLevel::C_FindObjectsFinal
bool C_FindObjectsFinal(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:377
Botan::PKCS11::ObjectFinder::ObjectFinder
ObjectFinder(Session &session, const std::vector< Attribute > &search_template)
Definition: p11_object.cpp:86
Botan::PKCS11::ObjectClass
ObjectClass
Definition: p11.h:678
Botan::PKCS11::AttributeContainer::AttributeContainer
AttributeContainer()=default
m_handle
HCRYPTPROV m_handle
Definition: es_capi.cpp:45
CK_ATTRIBUTE_TYPE
CK_ULONG CK_ATTRIBUTE_TYPE
Definition: pkcs11t.h:416
BOTAN_NOEXCEPT
#define BOTAN_NOEXCEPT
Definition: compiler.h:116
Botan::PKCS11::Object::Object
Object(Session &session, ObjectHandle handle)
Definition: p11_object.cpp:188
Botan::PKCS11::AttributeContainer::add_binary
void add_binary(AttributeType attribute, const uint8_t *value, size_t length)
Definition: p11_object.cpp:34
Botan::PKCS11::DomainParameterProperties::DomainParameterProperties
DomainParameterProperties(KeyType key_type)
Definition: p11_object.cpp:180
Botan::secure_vector
std::vector< T, secure_allocator< T >> secure_vector
Definition: secmem.h:121
Botan::PKCS11::AttributeType::Class
Botan::PKCS11::SecretKeyProperties::SecretKeyProperties
SecretKeyProperties(KeyType key_type)
Definition: p11_object.cpp:174
Botan::PKCS11::AttributeContainer::add_class
void add_class(ObjectClass object_class)
Definition: p11_object.cpp:22
Botan::PKCS11::Object::destroy
void destroy() const
Destroys the object.
Definition: p11_object.cpp:211
Botan::PKCS11::StorageObjectProperties::StorageObjectProperties
StorageObjectProperties(ObjectClass object_class)
Definition: p11_object.cpp:134
Botan::PKCS11::Object::m_session
const std::reference_wrapper< Session > m_session
Definition: p11_object.h:720
Botan::PKCS11::AttributeType::CertificateType
Botan::PKCS11::AttributeContainer::add_bool
void add_bool(AttributeType attribute, bool value)
Definition: p11_object.cpp:40
Botan::PKCS11::CertificateProperties::CertificateProperties
CertificateProperties(CertificateType cert_type)
Definition: p11_object.cpp:146
Botan::PKCS11::Object::get_attribute_value
secure_vector< uint8_t > get_attribute_value(AttributeType attribute) const
Definition: p11_object.cpp:198
Botan::PKCS11::LowLevel::C_FindObjectsInit
bool C_FindObjectsInit(SessionHandle session, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:359
Botan::PKCS11::False
const Bbool False
Definition: p11.h:856
Botan::PKCS11::Object::set_attribute_value
void set_attribute_value(AttributeType attribute, const secure_vector< uint8_t > &value) const
Sets the given value for the attribute (using C_SetAttributeValue)
Definition: p11_object.cpp:205
Botan
Definition: alg_id.cpp:13
Botan::PKCS11::ObjectHandle
CK_OBJECT_HANDLE ObjectHandle
Definition: p11.h:846
Botan::PKCS11::AttributeContainer::data
Attribute * data() const
Definition: p11_object.h:56
Botan::PKCS11::LowLevel::C_FindObjects
bool C_FindObjects(SessionHandle session, ObjectHandle *object_ptr, Ulong max_object_count, Ulong *object_count_ptr, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:367
Botan::PKCS11::StorageObjectProperties
Common attributes of all storage objects.
Definition: p11_object.h:193
Botan::PKCS11::ObjectClass::Data
Botan::PKCS11::LowLevel::C_GetAttributeValue
bool C_GetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:339
Botan::PKCS11::LowLevel::C_DestroyObject
bool C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:324
Botan::PKCS11::PublicKeyProperties::PublicKeyProperties
PublicKeyProperties(KeyType key_type)
Definition: p11_object.cpp:162
Botan::PKCS11::AttributeContainer::count
size_t count() const
Definition: p11_object.h:62
Botan::PKCS11::True
const Bbool True
Definition: p11.h:855
Botan::PKCS11::AttributeContainer::add_attribute
void add_attribute(AttributeType attribute, const uint8_t *value, uint32_t size)
Add an attribute with the given value and size to the attribute collection m_attributes ...
Definition: p11_object.cpp:46
Botan::PKCS11::PrivateKeyProperties::PrivateKeyProperties
PrivateKeyProperties(KeyType key_type)
Definition: p11_object.cpp:168
Botan::PKCS11::LowLevel::C_SetAttributeValue
bool C_SetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:349
Botan::PKCS11::ObjectClass::Certificate
Botan::PKCS11::Object::module
Module & module() const
Definition: p11_object.h:711
Botan::PKCS11::ObjectProperties::ObjectProperties
ObjectProperties(ObjectClass object_class)
Definition: p11_object.cpp:128
Botan::PKCS11::AttributeType::KeyType
Botan::PKCS11::AttributeContainer::add_numeric
void add_numeric(AttributeType attribute, T value)
Definition: p11_object.h:112
Botan::PKCS11::KeyProperties
Common attributes of all key objects.
Definition: p11_object.h:321
Botan::PKCS11::AttributeContainer
Helper class to build the Attribute / CK_ATTRIBUTE structures.
Definition: p11_object.h:28
Botan::PKCS11::DataObjectProperties::DataObjectProperties
DataObjectProperties()
Definition: p11_object.cpp:140
Botan::PKCS11::ObjectClass::PrivateKey
Botan::PKCS11::KeyProperties::KeyProperties
KeyProperties(ObjectClass object_class, KeyType key_type)
Definition: p11_object.cpp:154
Botan::PKCS11::KeyType
KeyType
Definition: p11.h:287
Botan::PKCS11::LowLevel::C_CopyObject
bool C_CopyObject(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *new_object_ptr, ReturnValue *return_value=ThrowException) const
Definition: p11.cpp:313
Botan::PKCS11::AttributeContainer::add_string
void add_string(AttributeType attribute, const std::string &value)
Definition: p11_object.cpp:28
Botan::PKCS11::Object::m_handle
ObjectHandle m_handle
Definition: p11_object.h:721
Botan::PKCS11::ObjectFinder::find
std::vector< ObjectHandle > find(std::uint32_t max_count=100) const
Definition: p11_object.cpp:108
Botan::PKCS11::Session
Represents a PKCS#11 session.
Definition: p11_session.h:22
CK_ATTRIBUTE::pValue
CK_VOID_PTR pValue
Definition: pkcs11t.h:566
Botan::PKCS11::Object::copy
ObjectHandle copy(const AttributeContainer &modified_attributes) const
Definition: p11_object.cpp:216
Botan::PKCS11::ObjectClass::SecretKey
CK_ATTRIBUTE
Definition: pkcs11t.h:564
Botan::PKCS11::Bbool
CK_BBOOL Bbool
Definition: p11.h:834