first try to create

master
Marc Wäckerlin 15 years ago
parent 65d22c37ec
commit 4f5f81b591
  1. 39
      src/cryptoki.cxx
  2. 77
      src/cryptoki.hxx

@ -212,7 +212,9 @@ namespace cryptoki {
CK_ATTRIBUTE* a(0);
try {
if (attrs.size()) {
//! @todo imlement attribute filtering
a = new CK_ATTRIBUTE[attrs.size()];
for (AttributeList::size_type i(0); i<attrs.size(); ++i)
a[i] = attrs[i];
}
//! calls @c C_FindObjectsInit
if (check(_slot._init->_fn->C_FindObjectsInit
@ -237,4 +239,39 @@ namespace cryptoki {
}
}
//----------------------------------------------------------------------------
Object Session::createCertificate(const std::string& derSubject,
const std::string& desValue) {
AttributeList attrs;
attrs.push_back(Attribute(CKA_CLASS)
.from<CK_OBJECT_CLASS>(CKO_CERTIFICATE));
attrs.push_back(Attribute(CKA_CERTIFICATE_TYPE)
.from<CK_CERTIFICATE_TYPE>(CKC_X_509));
attrs.push_back(Attribute(CKA_SUBJECT, derSubject));
attrs.push_back(Attribute(CKA_VALUE, desValue));
return create(attrs);
}
//----------------------------------------------------------------------------
Object Session::create(const AttributeList& attrs) {
CK_ATTRIBUTE* a(0);
try {
if (attrs.size()) {
a = new CK_ATTRIBUTE[attrs.size()];
for (AttributeList::size_type i(0); i<attrs.size(); ++i)
a[i] = attrs[i];
}
CK_OBJECT_HANDLE object;
//! calls @c C_CreateObject
check(_slot._init->_fn->C_CreateObject
(_session, a, attrs.size(), &object),
CRYPTOKI_FN_LOG("C_CreateObject"));
delete[] a;
return Object(*this, object);
} catch (...) {
delete[] a;
throw;
}
}
}

@ -36,31 +36,45 @@ namespace cryptoki {
#endif
#define UNDEF_CRYPTOKI_FN_LOG
#endif
inline std::string hex(const std::string& data) {
std::stringstream res;
for (std::string::const_iterator it(data.begin()); it!=data.end(); ++it)
res<<std::hex<<std::setfill('0')<<std::setw(2)
<<(unsigned int)(unsigned char)*it;
return res.str();
}
static const std::string LETTER_CHARS
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
static const std::string NUMBER_CHARS
("0123456789");
//! Contains @c @ in addition to standard characters.
static const std::string GRAFIC_CHARS
("!\"#%&'()*+,-./:;<=>?[\\]^_{|}~");
("!\"#%&'()*+,-./:;<=>?[\\]^_{|}~@");
static const std::string BLANK_CHARS
(" ");
static const std::string VALID_CHARS
(LETTER_CHARS+NUMBER_CHARS+GRAFIC_CHARS+BLANK_CHARS);
inline std::string hex(const std::string& data,
std::string::size_type len=20) {
std::stringstream res;
std::string::size_type pos(0);
for (std::string::const_iterator it(data.begin()); it!=data.end(); ++it) {
res<<std::hex<<std::setfill('0')<<std::setw(2)
<<(unsigned int)(unsigned char)*it;
++pos;
if (pos%len==0 || pos==data.size()) {
res<<std::string(2*(len-(pos-1)%len), ' ');
for (std::string::size_type i(pos-(pos-1)%len-1); i<pos; ++i)
res<<(VALID_CHARS.find(data[i])==std::string::npos?'.':data[i]);
if (pos!=data.size()) res<<std::endl;
}
}
return res.str();
}
inline std::string readable(const std::string& data) {
if (data.find_first_not_of(VALID_CHARS)<data.size())
return "0x"+hex(data);
inline std::string readable(const std::string& data,
std::string::size_type len=20) {
if (!data.size())
return "<empty>";
else if (data.find_first_not_of(VALID_CHARS)<data.size())
return hex(data);
else
return data;
return "\""+data+"\"";
}
inline std::string string(CK_ULONG num) {
@ -121,6 +135,7 @@ namespace cryptoki {
struct Attribute {
Attribute(CK_ATTRIBUTE_TYPE t = -1): type(t) {}
Attribute(CK_ATTRIBUTE_TYPE t, const std::string& v): type(t), value(v) {}
Attribute(CK_ATTRIBUTE& attr):
type(attr.type), value((char*)attr.pValue, attr.ulValueLen) {
free(attr.pValue);
@ -130,6 +145,18 @@ namespace cryptoki {
value = v;
return *this;
}
//! Convert to a @c CK_ATTRIBUTE.
/*! @note @c pValue points to the internal buffer of this
element and must therefore not be changed. Also this object
must not be destructed before the returned @c
CK_ATTRIBUTE. */
operator CK_ATTRIBUTE() const {
CK_ATTRIBUTE a;
a.type = type;
a.pValue = const_cast<char*>(value.begin().operator->());
a.ulValueLen = value.size();
return a;
}
std::string name() {
switch (type) {
case CKA_CLASS: return "CLASS";
@ -213,6 +240,10 @@ namespace cryptoki {
default: return readable(value);
}
}
template<typename TYPE> Attribute from(const TYPE& v) {
value = std::string((char*)&v, sizeof(TYPE));
return *this;
}
CK_ATTRIBUTE_TYPE type;
std::string value;
};
@ -845,8 +876,13 @@ namespace cryptoki {
Functions. They provide a higher level simpler access. */
//@{
//! Get a list of matching objects.
ObjectList find(const AttributeList& attrs=AttributeList());
//! Create a new Certificate Object.
Object createCertificate(const std::string& derSubject,
const std::string& desValue);
//@}
/*! @name C Like Error Handling
@ -874,12 +910,15 @@ namespace cryptoki {
Direct access to the low level cryptoki API. Better use the
comfort methods. */
//@{
bool cancel() {
//! calls @c C_CancelFunction
return check(_slot._init->_fn->C_CancelFunction(_session),
CRYPTOKI_FN_LOG("C_CancelFunction"));
}
//! Create a new object.
Object create(const AttributeList& attrs);
std::string decrypt(std::string in) {
std::string res;
@ -1343,16 +1382,6 @@ namespace cryptoki {
}
@endcode */
/*! @todo Not implemented:
@code
bool createobject() {
//! calls @c C_CreateObject
return check(_session->_slot._init->_fn->C_CreateObject(_session->_session, CK_ATTRIBUTE_PTR, CK_ULONG,
CK_OBJECT_HANDLE_PTR),
CRYPTOKI_FN_LOG("C_CreateObject"));
}
@endcode */
bool decryptinit(CK_MECHANISM_TYPE type, std::string param,
const Object& key) {
CK_MECHANISM mech = {
@ -1722,7 +1751,6 @@ namespace cryptoki {
//@}
};
#endif
#ifdef UNDEF_CRYPTOKI_FN_LOG // cleanup if it was set in here
#undef CRYPTOKI_FN_LOG
@ -1730,3 +1758,4 @@ namespace cryptoki {
#endif
}
#endif

Loading…
Cancel
Save