|
/***************************************************************************
|
|
$RCSfile$
|
|
-------------------
|
|
cvs : $Id$
|
|
begin : Thu Sep 11 2003
|
|
copyright : (C) 2003 by Martin Preuss
|
|
email : martin@libchipcard.de
|
|
|
|
***************************************************************************
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Lesser General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2.1 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* Lesser General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Lesser General Public *
|
|
* License along with this library; if not, write to the Free Software *
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
|
|
* MA 02111-1307 USA *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
|
|
#include "crypttoken_p.h"
|
|
#include "i18n_l.h"
|
|
#include <gwenhywfar/misc.h>
|
|
#include <gwenhywfar/debug.h>
|
|
#include <gwenhywfar/md.h>
|
|
#include <gwenhywfar/padd.h>
|
|
#include <gwenhywfar/waitcallback.h>
|
|
|
|
|
|
|
|
GWEN_LIST_FUNCTIONS(GWEN_CRYPTTOKEN_SIGNINFO,
|
|
GWEN_CryptToken_SignInfo)
|
|
GWEN_LIST_FUNCTIONS(GWEN_CRYPTTOKEN_CRYPTINFO,
|
|
GWEN_CryptToken_CryptInfo)
|
|
GWEN_LIST_FUNCTIONS(GWEN_CRYPTTOKEN_KEYINFO,
|
|
GWEN_CryptToken_KeyInfo)
|
|
|
|
GWEN_LIST_FUNCTIONS(GWEN_CRYPTTOKEN_CONTEXT,
|
|
GWEN_CryptToken_Context)
|
|
|
|
GWEN_LIST_FUNCTIONS(GWEN_CRYPTTOKEN,
|
|
GWEN_CryptToken)
|
|
GWEN_INHERIT_FUNCTIONS(GWEN_CRYPTTOKEN)
|
|
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_HASHALGO GWEN_CryptToken_HashAlgo_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_HashAlgo_None;
|
|
else if (strcasecmp(s, "sha1")==0)
|
|
return GWEN_CryptToken_HashAlgo_SHA1;
|
|
else if (strcasecmp(s, "rmd160")==0)
|
|
return GWEN_CryptToken_HashAlgo_RMD160;
|
|
else if (strcasecmp(s, "md5")==0)
|
|
return GWEN_CryptToken_HashAlgo_MD5;
|
|
else if (strcasecmp(s, "any")==0)
|
|
return GWEN_CryptToken_HashAlgo_Any;
|
|
return GWEN_CryptToken_HashAlgo_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_HashAlgo_toString(GWEN_CRYPTTOKEN_HASHALGO a){
|
|
switch(a) {
|
|
case GWEN_CryptToken_HashAlgo_None:
|
|
return "none";
|
|
case GWEN_CryptToken_HashAlgo_SHA1:
|
|
return "sha1";
|
|
case GWEN_CryptToken_HashAlgo_RMD160:
|
|
return "rmd160";
|
|
case GWEN_CryptToken_HashAlgo_MD5:
|
|
return "md5";
|
|
case GWEN_CryptToken_HashAlgo_Any:
|
|
return "any";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_PADDALGO GWEN_CryptToken_PaddAlgo_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_PaddAlgo_None;
|
|
else if (strcasecmp(s, "iso9796_1")==0)
|
|
return GWEN_CryptToken_PaddAlgo_ISO9796_1;
|
|
else if (strcasecmp(s, "iso9796_1a4")==0)
|
|
return GWEN_CryptToken_PaddAlgo_ISO9796_1A4;
|
|
else if (strcasecmp(s, "iso9796_2")==0)
|
|
return GWEN_CryptToken_PaddAlgo_ISO9796_2;
|
|
else if (strcasecmp(s, "pkcs1_1")==0)
|
|
return GWEN_CryptToken_PaddAlgo_PKCS1_1;
|
|
else if (strcasecmp(s, "pkcs1_2")==0)
|
|
return GWEN_CryptToken_PaddAlgo_PKCS1_2;
|
|
else if (strcasecmp(s, "leftzero")==0)
|
|
return GWEN_CryptToken_PaddAlgo_LeftZero;
|
|
else if (strcasecmp(s, "rightzero")==0)
|
|
return GWEN_CryptToken_PaddAlgo_RightZero;
|
|
else if (strcasecmp(s, "ansix9_23")==0)
|
|
return GWEN_CryptToken_PaddAlgo_ANSIX9_23;
|
|
else if (strcasecmp(s, "any")==0)
|
|
return GWEN_CryptToken_PaddAlgo_Any;
|
|
return GWEN_CryptToken_PaddAlgo_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_PaddAlgo_toString(GWEN_CRYPTTOKEN_PADDALGO a){
|
|
switch(a) {
|
|
case GWEN_CryptToken_PaddAlgo_None:
|
|
return "none";
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1:
|
|
return "iso9796_1";
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1A4:
|
|
return "iso9796_1a4";
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_2:
|
|
return "iso9796_2";
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_1:
|
|
return "pkcs1_1";
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_2:
|
|
return "pkcs1_2";
|
|
case GWEN_CryptToken_PaddAlgo_LeftZero:
|
|
return "leftzero";
|
|
case GWEN_CryptToken_PaddAlgo_RightZero:
|
|
return "rightzero";
|
|
case GWEN_CryptToken_PaddAlgo_ANSIX9_23:
|
|
return "ansix9_23";
|
|
case GWEN_CryptToken_PaddAlgo_Any:
|
|
return "any";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTALGO GWEN_CryptToken_CryptAlgo_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_CryptAlgo_None;
|
|
else if (strcasecmp(s, "rsa")==0)
|
|
return GWEN_CryptToken_CryptAlgo_RSA;
|
|
else if (strcasecmp(s, "dsa")==0)
|
|
return GWEN_CryptToken_CryptAlgo_DSA;
|
|
else if (strcasecmp(s, "des")==0)
|
|
return GWEN_CryptToken_CryptAlgo_DES;
|
|
else if (strcasecmp(s, "des_3k")==0)
|
|
return GWEN_CryptToken_CryptAlgo_DES_3K;
|
|
else if (strcasecmp(s, "any")==0)
|
|
return GWEN_CryptToken_CryptAlgo_Any;
|
|
return GWEN_CryptToken_CryptAlgo_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_CryptAlgo_toString(GWEN_CRYPTTOKEN_CRYPTALGO a){
|
|
switch(a) {
|
|
case GWEN_CryptToken_CryptAlgo_None:
|
|
return "none";
|
|
case GWEN_CryptToken_CryptAlgo_RSA:
|
|
return "rsa";
|
|
case GWEN_CryptToken_CryptAlgo_DSA:
|
|
return "dsa";
|
|
case GWEN_CryptToken_CryptAlgo_DES:
|
|
return "des";
|
|
case GWEN_CryptToken_CryptAlgo_DES_3K:
|
|
return "des_3k";
|
|
case GWEN_CryptToken_CryptAlgo_Any:
|
|
return "any";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_DEVICE GWEN_CryptToken_Device_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_Device_None;
|
|
else if (strcasecmp(s, "file")==0)
|
|
return GWEN_CryptToken_Device_File;
|
|
else if (strcasecmp(s, "card")==0)
|
|
return GWEN_CryptToken_Device_Card;
|
|
else if (strcasecmp(s, "any")==0)
|
|
return GWEN_CryptToken_Device_Any;
|
|
return GWEN_CryptToken_Device_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_Device_toString(GWEN_CRYPTTOKEN_DEVICE d){
|
|
switch(d) {
|
|
case GWEN_CryptToken_Device_None:
|
|
return "none";
|
|
case GWEN_CryptToken_Device_File:
|
|
return "file";
|
|
case GWEN_CryptToken_Device_Card:
|
|
return "card";
|
|
case GWEN_CryptToken_Device_Any:
|
|
return "any";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_PINTYPE GWEN_CryptToken_PinType_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_PinType_None;
|
|
else if (strcasecmp(s, "access")==0)
|
|
return GWEN_CryptToken_PinType_Access;
|
|
else if (strcasecmp(s, "manage")==0)
|
|
return GWEN_CryptToken_PinType_Manage;
|
|
return GWEN_CryptToken_PinType_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_PinType_toString(GWEN_CRYPTTOKEN_PINTYPE pt){
|
|
switch(pt) {
|
|
case GWEN_CryptToken_PinType_None:
|
|
return "none";
|
|
case GWEN_CryptToken_PinType_Access:
|
|
return "access";
|
|
case GWEN_CryptToken_PinType_Manage:
|
|
return "manage";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_PINENCODING
|
|
GWEN_CryptToken_PinEncoding_fromString(const char *s){
|
|
assert(s);
|
|
if (strcasecmp(s, "none")==0)
|
|
return GWEN_CryptToken_PinEncoding_None;
|
|
else if (strcasecmp(s, "bin")==0)
|
|
return GWEN_CryptToken_PinEncoding_Bin;
|
|
else if (strcasecmp(s, "bcd")==0)
|
|
return GWEN_CryptToken_PinEncoding_BCD;
|
|
else if (strcasecmp(s, "ascii")==0)
|
|
return GWEN_CryptToken_PinEncoding_ASCII;
|
|
return GWEN_CryptToken_PinEncoding_Unknown;
|
|
}
|
|
|
|
|
|
|
|
const char*
|
|
GWEN_CryptToken_PinEncoding_toString(GWEN_CRYPTTOKEN_PINENCODING pe){
|
|
switch(pe) {
|
|
case GWEN_CryptToken_PinEncoding_None:
|
|
return "none";
|
|
case GWEN_CryptToken_PinEncoding_Bin:
|
|
return "bin";
|
|
case GWEN_CryptToken_PinEncoding_BCD:
|
|
return "bcd";
|
|
case GWEN_CryptToken_PinEncoding_ASCII:
|
|
return "ascii";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXTTYPE
|
|
GWEN_CryptToken_ContextType_fromString(const char *s) {
|
|
assert(s);
|
|
if (strcasecmp(s, "unknown")==0)
|
|
return GWEN_CryptToken_ContextType_Unknown;
|
|
else if (strcasecmp(s, "hbci")==0)
|
|
return GWEN_CryptToken_ContextType_HBCI;
|
|
else {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "Unknown context type \"%s\"", s);
|
|
return GWEN_CryptToken_ContextType_Unknown;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const char*
|
|
GWEN_CryptToken_ContextType_toString(GWEN_CRYPTTOKEN_CONTEXTTYPE t) {
|
|
switch(t) {
|
|
case GWEN_CryptToken_ContextType_Unknown:
|
|
return "unknown";
|
|
case GWEN_CryptToken_ContextType_HBCI:
|
|
return "hbci";
|
|
|
|
default:
|
|
DBG_WARN(GWEN_LOGDOMAIN, "Unhandled context type %d", t);
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* SignInfo functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
GWEN_CRYPTTOKEN_SIGNINFO *GWEN_CryptToken_SignInfo_new(){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN_SIGNINFO, si);
|
|
GWEN_LIST_INIT(GWEN_CRYPTTOKEN_SIGNINFO, si);
|
|
|
|
return si;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SignInfo_free(GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
if (si) {
|
|
GWEN_LIST_FINI(GWEN_CRYPTTOKEN_SIGNINFO, si);
|
|
GWEN_FREE_OBJECT(si);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_SIGNINFO*
|
|
GWEN_CryptToken_SignInfo_dup(const GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *nsi;
|
|
|
|
assert(si);
|
|
nsi=GWEN_CryptToken_SignInfo_new();
|
|
nsi->id=si->id;
|
|
nsi->hashAlgo=si->hashAlgo;
|
|
nsi->paddAlgo=si->paddAlgo;
|
|
return nsi;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_SIGNINFO *GWEN_CryptToken_SignInfo_fromDb(GWEN_DB_NODE *db){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
const char *s;
|
|
|
|
si=GWEN_CryptToken_SignInfo_new();
|
|
si->id=GWEN_DB_GetIntValue(db, "id", 0, 0);
|
|
s=GWEN_DB_GetCharValue(db, "hashAlgo", 0, 0);
|
|
if (s)
|
|
si->hashAlgo=GWEN_CryptToken_HashAlgo_fromString(s);
|
|
else
|
|
si->hashAlgo=GWEN_CryptToken_HashAlgo_None;
|
|
|
|
s=GWEN_DB_GetCharValue(db, "paddAlgo", 0, 0);
|
|
if (s)
|
|
si->paddAlgo=GWEN_CryptToken_PaddAlgo_fromString(s);
|
|
else
|
|
si->paddAlgo=GWEN_CryptToken_PaddAlgo_None;
|
|
|
|
return si;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_SignInfo_toDb(const GWEN_CRYPTTOKEN_SIGNINFO *si,
|
|
GWEN_DB_NODE *db){
|
|
assert(si);
|
|
assert(db);
|
|
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"id", si->id);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"hashAlgo",
|
|
GWEN_CryptToken_HashAlgo_toString(si->hashAlgo));
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"paddAlgo",
|
|
GWEN_CryptToken_PaddAlgo_toString(si->paddAlgo));
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_SIGNINFO *GWEN_CryptToken_SignInfo_fromXml(GWEN_XMLNODE *n){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
const char *s;
|
|
|
|
si=GWEN_CryptToken_SignInfo_new();
|
|
si->id=GWEN_XMLNode_GetIntValue(n, "id", 0);
|
|
s=GWEN_XMLNode_GetCharValue(n, "hashAlgo", 0);
|
|
if (s)
|
|
si->hashAlgo=GWEN_CryptToken_HashAlgo_fromString(s);
|
|
else
|
|
si->hashAlgo=GWEN_CryptToken_HashAlgo_None;
|
|
|
|
s=GWEN_XMLNode_GetCharValue(n, "paddAlgo", 0);
|
|
if (s)
|
|
si->paddAlgo=GWEN_CryptToken_PaddAlgo_fromString(s);
|
|
else
|
|
si->paddAlgo=GWEN_CryptToken_PaddAlgo_None;
|
|
|
|
return si;
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32
|
|
GWEN_CryptToken_SignInfo_GetId(const GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
assert(si);
|
|
return si->id;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SignInfo_SetId(GWEN_CRYPTTOKEN_SIGNINFO *si,
|
|
GWEN_TYPE_UINT32 id){
|
|
assert(si);
|
|
si->id=id;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_HASHALGO
|
|
GWEN_CryptToken_SignInfo_GetHashAlgo(const GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
assert(si);
|
|
return si->hashAlgo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SignInfo_SetHashAlgo(GWEN_CRYPTTOKEN_SIGNINFO *si,
|
|
GWEN_CRYPTTOKEN_HASHALGO a){
|
|
assert(si);
|
|
si->hashAlgo=a;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_PADDALGO
|
|
GWEN_CryptToken_SignInfo_GetPaddAlgo(const GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
assert(si);
|
|
return si->paddAlgo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SignInfo_SetPaddAlgo(GWEN_CRYPTTOKEN_SIGNINFO *si,
|
|
GWEN_CRYPTTOKEN_PADDALGO a){
|
|
assert(si);
|
|
si->paddAlgo=a;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* CryptInfo functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *GWEN_CryptToken_CryptInfo_new(){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN_CRYPTINFO, ci);
|
|
GWEN_LIST_INIT(GWEN_CRYPTTOKEN_CRYPTINFO, ci);
|
|
|
|
return ci;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_CryptInfo_free(GWEN_CRYPTTOKEN_CRYPTINFO *ci){
|
|
if (ci) {
|
|
GWEN_LIST_FINI(GWEN_CRYPTTOKEN_CRYPTINFO, ci);
|
|
GWEN_FREE_OBJECT(ci);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTINFO*
|
|
GWEN_CryptToken_CryptInfo_dup(const GWEN_CRYPTTOKEN_CRYPTINFO *ci){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *nci;
|
|
|
|
assert(ci);
|
|
nci=GWEN_CryptToken_CryptInfo_new();
|
|
nci->id=ci->id;
|
|
nci->cryptAlgo=ci->cryptAlgo;
|
|
nci->paddAlgo=ci->paddAlgo;
|
|
|
|
return nci;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *GWEN_CryptToken_CryptInfo_fromDb(GWEN_DB_NODE *db){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
const char *s;
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_new();
|
|
ci->id=GWEN_DB_GetIntValue(db, "id", 0, 0);
|
|
s=GWEN_DB_GetCharValue(db, "cryptAlgo", 0, 0);
|
|
if (s)
|
|
ci->cryptAlgo=GWEN_CryptToken_CryptAlgo_fromString(s);
|
|
else
|
|
ci->cryptAlgo=GWEN_CryptToken_CryptAlgo_None;
|
|
|
|
s=GWEN_DB_GetCharValue(db, "paddAlgo", 0, 0);
|
|
if (s)
|
|
ci->paddAlgo=GWEN_CryptToken_PaddAlgo_fromString(s);
|
|
else
|
|
ci->paddAlgo=GWEN_CryptToken_PaddAlgo_None;
|
|
|
|
return ci;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_CryptInfo_toDb(const GWEN_CRYPTTOKEN_CRYPTINFO *ci,
|
|
GWEN_DB_NODE *db){
|
|
assert(ci);
|
|
assert(db);
|
|
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"id", ci->id);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"cryptAlgo",
|
|
GWEN_CryptToken_CryptAlgo_toString(ci->cryptAlgo));
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"paddAlgo",
|
|
GWEN_CryptToken_PaddAlgo_toString(ci->paddAlgo));
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *GWEN_CryptToken_CryptInfo_fromXml(GWEN_XMLNODE *n){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
const char *s;
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_new();
|
|
ci->id=GWEN_XMLNode_GetIntValue(n, "id", 0);
|
|
s=GWEN_XMLNode_GetCharValue(n, "cryptAlgo", 0);
|
|
if (s)
|
|
ci->cryptAlgo=GWEN_CryptToken_CryptAlgo_fromString(s);
|
|
else
|
|
ci->cryptAlgo=GWEN_CryptToken_CryptAlgo_None;
|
|
|
|
s=GWEN_XMLNode_GetCharValue(n, "paddAlgo", 0);
|
|
if (s)
|
|
ci->paddAlgo=GWEN_CryptToken_PaddAlgo_fromString(s);
|
|
else
|
|
ci->paddAlgo=GWEN_CryptToken_PaddAlgo_None;
|
|
|
|
return ci;
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32
|
|
GWEN_CryptToken_CryptInfo_GetId(const GWEN_CRYPTTOKEN_CRYPTINFO *ci){
|
|
assert(ci);
|
|
return ci->id;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_CryptInfo_SetId(GWEN_CRYPTTOKEN_CRYPTINFO *ci,
|
|
GWEN_TYPE_UINT32 id){
|
|
assert(ci);
|
|
ci->id=id;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTALGO
|
|
GWEN_CryptToken_CryptInfo_GetCryptAlgo(const GWEN_CRYPTTOKEN_CRYPTINFO *ci){
|
|
assert(ci);
|
|
return ci->cryptAlgo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_CryptInfo_SetCryptAlgo(GWEN_CRYPTTOKEN_CRYPTINFO *ci,
|
|
GWEN_CRYPTTOKEN_CRYPTALGO a){
|
|
assert(ci);
|
|
ci->cryptAlgo=a;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_PADDALGO
|
|
GWEN_CryptToken_CryptInfo_GetPaddAlgo(const GWEN_CRYPTTOKEN_CRYPTINFO *ci){
|
|
assert(ci);
|
|
return ci->paddAlgo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_CryptInfo_SetPaddAlgo(GWEN_CRYPTTOKEN_CRYPTINFO *ci,
|
|
GWEN_CRYPTTOKEN_PADDALGO a){
|
|
assert(ci);
|
|
ci->paddAlgo=a;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* KeyInfo functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
GWEN_CRYPTTOKEN_KEYINFO *GWEN_CryptToken_KeyInfo_new(){
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN_KEYINFO, ki);
|
|
GWEN_LIST_INIT(GWEN_CRYPTTOKEN_KEYINFO, ki);
|
|
|
|
return ki;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_free(GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
if (ki) {
|
|
GWEN_LIST_FINI(GWEN_CRYPTTOKEN_KEYINFO, ki);
|
|
free(ki->keyDescription);
|
|
GWEN_FREE_OBJECT(ki);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_KEYINFO *GWEN_CryptToken_KeyInfo_fromDb(GWEN_DB_NODE *db){
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
const char *s;
|
|
int i;
|
|
|
|
ki=GWEN_CryptToken_KeyInfo_new();
|
|
ki->keyId=GWEN_DB_GetIntValue(db, "keyId", 0, 0);
|
|
ki->keySize=GWEN_DB_GetIntValue(db, "keySize", 0, 0);
|
|
ki->minKeySize=GWEN_DB_GetIntValue(db, "minKeySize", 0, 0);
|
|
ki->maxKeySize=GWEN_DB_GetIntValue(db, "maxKeySize", 0, 0);
|
|
ki->chunkSize=GWEN_DB_GetIntValue(db, "chunkSize", 0, 0);
|
|
s=GWEN_DB_GetCharValue(db, "cryptAlgo", 0, 0);
|
|
if (s)
|
|
ki->cryptAlgo=GWEN_CryptToken_CryptAlgo_fromString(s);
|
|
else
|
|
ki->cryptAlgo=GWEN_CryptToken_CryptAlgo_None;
|
|
s=GWEN_DB_GetCharValue(db, "keyDescription", 0, 0);
|
|
if (s)
|
|
ki->keyDescription=strdup(s);
|
|
for (i=0; ; i++) {
|
|
s=GWEN_DB_GetCharValue(db, "keyFlags", i, 0);
|
|
if (!s)
|
|
break;
|
|
if (strcasecmp(s, "canSign")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_SIGN;
|
|
else if (strcasecmp(s, "canVerify")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_VERIFY;
|
|
else if (strcasecmp(s, "canEncrypt")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_ENCRYPT;
|
|
else if (strcasecmp(s, "canDecrypt")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_DECRYPT;
|
|
else if (strcasecmp(s, "readable")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_READABLE;
|
|
else if (strcasecmp(s, "writeable")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_WRITEABLE;
|
|
else if (strcasecmp(s, "hasSignSeq")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_HAS_SIGNSEQ;
|
|
else {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "Unknown flag \"%s\"", s);
|
|
}
|
|
} /* for */
|
|
|
|
return ki;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_toDb(const GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_DB_NODE *db){
|
|
assert(ki);
|
|
assert(db);
|
|
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"keyId", ki->keyId);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"keySize", ki->keySize);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"minKeySize", ki->minKeySize);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"maxKeySize", ki->maxKeySize);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"chunkSize", ki->chunkSize);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"cryptAlgo",
|
|
GWEN_CryptToken_CryptAlgo_toString(ki->cryptAlgo));
|
|
if (ki->keyDescription)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"keyDescription",
|
|
ki->keyDescription);
|
|
GWEN_DB_DeleteVar(db, "keyFlags");
|
|
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_SIGN)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "canSign");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_VERIFY)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "canVerify");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_ENCRYPT)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "canEncrypt");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_DECRYPT)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "canDecrypt");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_READABLE)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "readable");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_WRITEABLE)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "writeable");
|
|
if (ki->keyFlags & GWEN_CRYPTTOKEN_KEYINFO_FLAGS_HAS_SIGNSEQ)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"keyFlags", "hasSignSeq");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_KEYINFO *GWEN_CryptToken_KeyInfo_fromXml(GWEN_XMLNODE *n){
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
GWEN_XMLNODE *nn;
|
|
const char *s;
|
|
|
|
ki=GWEN_CryptToken_KeyInfo_new();
|
|
ki->keyId=GWEN_XMLNode_GetIntValue(n, "keyId", 0);
|
|
ki->keySize=GWEN_XMLNode_GetIntValue(n, "keySize", 0);
|
|
ki->minKeySize=GWEN_XMLNode_GetIntValue(n, "minKeySize", 0);
|
|
ki->maxKeySize=GWEN_XMLNode_GetIntValue(n, "maxKeySize", 0);
|
|
ki->chunkSize=GWEN_XMLNode_GetIntValue(n, "chunkSize", 0);
|
|
s=GWEN_XMLNode_GetCharValue(n, "cryptAlgo", 0);
|
|
if (s)
|
|
ki->cryptAlgo=GWEN_CryptToken_CryptAlgo_fromString(s);
|
|
else
|
|
ki->cryptAlgo=GWEN_CryptToken_CryptAlgo_None;
|
|
s=GWEN_XMLNode_GetCharValue(n, "keyDescription", 0);
|
|
if (s)
|
|
ki->keyDescription=strdup(s);
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "keyFlags", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "flag", 0, 0);
|
|
while(nnn) {
|
|
GWEN_XMLNODE *nd;
|
|
|
|
nd=GWEN_XMLNode_GetFirstData(nnn);
|
|
if (nd) {
|
|
s=GWEN_XMLNode_GetData(nd);
|
|
assert(s);
|
|
if (strcasecmp(s, "canSign")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_SIGN;
|
|
else if (strcasecmp(s, "canVerify")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_VERIFY;
|
|
else if (strcasecmp(s, "canEncrypt")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_ENCRYPT;
|
|
else if (strcasecmp(s, "canDecrypt")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_CAN_DECRYPT;
|
|
else if (strcasecmp(s, "readable")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_READABLE;
|
|
else if (strcasecmp(s, "writeable")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_WRITEABLE;
|
|
else if (strcasecmp(s, "hasSignSeq")==0)
|
|
ki->keyFlags|=GWEN_CRYPTTOKEN_KEYINFO_FLAGS_HAS_SIGNSEQ;
|
|
else {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "Unknown flag \"%s\"", s);
|
|
}
|
|
}
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "flag", 0, 0);
|
|
} /* while */
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "keyFlags", 0, 0);
|
|
} /* while */
|
|
|
|
return ki;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_KeyInfo_dup(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
GWEN_CRYPTTOKEN_KEYINFO *nki;
|
|
|
|
assert(ki);
|
|
nki=GWEN_CryptToken_KeyInfo_new();
|
|
nki->keyId=ki->keyId;
|
|
nki->keySize=ki->keySize;
|
|
nki->minKeySize=ki->minKeySize;
|
|
nki->maxKeySize=ki->maxKeySize;
|
|
nki->chunkSize=ki->chunkSize;
|
|
nki->cryptAlgo=ki->cryptAlgo;
|
|
nki->keyFlags=ki->keyFlags;
|
|
if (ki->keyDescription)
|
|
nki->keyDescription=strdup(ki->keyDescription);
|
|
|
|
return nki;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_GetKeyId(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->keyId;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetKeyId(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
int id){
|
|
assert(ki);
|
|
ki->keyId=id;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_GetKeySize(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->keySize;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetKeySize(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
int i){
|
|
assert(ki);
|
|
ki->keySize=i;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_GetMinKeySize(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->minKeySize;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetMinKeySize(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
int i) {
|
|
assert(ki);
|
|
ki->minKeySize=i;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_GetMaxKeySize(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->maxKeySize;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetMaxKeySize(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
int i) {
|
|
assert(ki);
|
|
ki->maxKeySize=i;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_KeyInfo_GetChunkSize(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->chunkSize;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetChunkSize(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
int i){
|
|
assert(ki);
|
|
ki->chunkSize=i;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CRYPTALGO
|
|
GWEN_CryptToken_KeyInfo_GetCryptAlgo(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->cryptAlgo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetCryptAlgo(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_CRYPTTOKEN_CRYPTALGO a){
|
|
assert(ki);
|
|
ki->cryptAlgo=a;
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32
|
|
GWEN_CryptToken_KeyInfo_GetKeyFlags(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->keyFlags;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetKeyFlags(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_TYPE_UINT32 fl){
|
|
assert(ki);
|
|
ki->keyFlags=fl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_AddKeyFlags(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_TYPE_UINT32 fl){
|
|
assert(ki);
|
|
ki->keyFlags|=fl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SubKeyFlags(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_TYPE_UINT32 fl){
|
|
assert(ki);
|
|
ki->keyFlags&=~fl;
|
|
}
|
|
|
|
|
|
|
|
const char*
|
|
GWEN_CryptToken_KeyInfo_GetDescription(const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ki);
|
|
return ki->keyDescription;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_KeyInfo_SetDescription(GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
const char *s){
|
|
assert(ki);
|
|
free(ki->keyDescription);
|
|
if (s)
|
|
ki->keyDescription=strdup(s);
|
|
else
|
|
ki->keyDescription=0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* Context functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXT *GWEN_CryptToken_Context_new(){
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN_CONTEXT, ctx);
|
|
GWEN_LIST_INIT(GWEN_CRYPTTOKEN_CONTEXT, ctx);
|
|
|
|
return ctx;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Context_free(GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
if (ctx) {
|
|
GWEN_CryptToken_KeyInfo_free(ctx->signKeyInfo);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->verifyKeyInfo);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->encryptKeyInfo);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->decryptKeyInfo);
|
|
GWEN_CryptToken_CryptInfo_free(ctx->cryptInfo);
|
|
GWEN_CryptToken_SignInfo_free(ctx->signInfo);
|
|
free(ctx->description);
|
|
GWEN_FREE_OBJECT(ctx);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXT*
|
|
GWEN_CryptToken_Context_dup(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
GWEN_CRYPTTOKEN_CONTEXT *nctx;
|
|
|
|
assert(ctx);
|
|
nctx=GWEN_CryptToken_Context_new();
|
|
nctx->id=ctx->id;
|
|
|
|
if (ctx->signKeyInfo)
|
|
nctx->signKeyInfo=GWEN_CryptToken_KeyInfo_dup(ctx->signKeyInfo);
|
|
if (ctx->verifyKeyInfo)
|
|
nctx->verifyKeyInfo=GWEN_CryptToken_KeyInfo_dup(ctx->verifyKeyInfo);
|
|
if (ctx->signInfo)
|
|
nctx->signInfo=GWEN_CryptToken_SignInfo_dup(ctx->signInfo);
|
|
|
|
if (ctx->encryptKeyInfo)
|
|
nctx->encryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ctx->encryptKeyInfo);
|
|
if (ctx->decryptKeyInfo)
|
|
nctx->decryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ctx->decryptKeyInfo);
|
|
if (ctx->cryptInfo)
|
|
nctx->cryptInfo=GWEN_CryptToken_CryptInfo_dup(ctx->cryptInfo);
|
|
|
|
if (ctx->description)
|
|
nctx->description=strdup(ctx->description);
|
|
|
|
nctx->contextType=ctx->contextType;
|
|
|
|
return nctx;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXT *GWEN_CryptToken_Context_fromDb(GWEN_DB_NODE *db){
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
GWEN_DB_NODE *dbT;
|
|
const char *s;
|
|
|
|
assert(db);
|
|
|
|
ctx=GWEN_CryptToken_Context_new();
|
|
ctx->id=GWEN_DB_GetIntValue(db, "id", 0, 0);
|
|
s=GWEN_DB_GetCharValue(db, "contextType", 0, 0);
|
|
if (s)
|
|
ctx->contextType=GWEN_CryptToken_ContextType_fromString(s);
|
|
else
|
|
ctx->contextType=GWEN_CryptToken_ContextType_Unknown;
|
|
s=GWEN_DB_GetCharValue(db, "description", 0, 0);
|
|
if (s)
|
|
ctx->description=strdup(s);
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "signKeyInfo");
|
|
if (dbT)
|
|
ctx->signKeyInfo=GWEN_CryptToken_KeyInfo_fromDb(dbT);
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "verifyKeyInfo");
|
|
if (dbT)
|
|
ctx->verifyKeyInfo=GWEN_CryptToken_KeyInfo_fromDb(dbT);
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "signInfo");
|
|
if (dbT)
|
|
ctx->signInfo=GWEN_CryptToken_SignInfo_fromDb(dbT);
|
|
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "encryptKeyInfo");
|
|
if (dbT)
|
|
ctx->encryptKeyInfo=GWEN_CryptToken_KeyInfo_fromDb(dbT);
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "decryptKeyInfo");
|
|
if (dbT)
|
|
ctx->decryptKeyInfo=GWEN_CryptToken_KeyInfo_fromDb(dbT);
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "cryptInfo");
|
|
if (dbT)
|
|
ctx->cryptInfo=GWEN_CryptToken_CryptInfo_fromDb(dbT);
|
|
|
|
return ctx;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Context_toDb(const GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
GWEN_DB_NODE *db){
|
|
GWEN_DB_NODE *dbT;
|
|
|
|
assert(ctx);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"id", ctx->id);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"contextType",
|
|
GWEN_CryptToken_ContextType_toString(ctx->contextType));
|
|
if (ctx->description)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"description", ctx->description);
|
|
if (ctx->signKeyInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"signKeyInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_KeyInfo_toDb(ctx->signKeyInfo, dbT);
|
|
}
|
|
if (ctx->verifyKeyInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"verifyKeyInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_KeyInfo_toDb(ctx->verifyKeyInfo, dbT);
|
|
}
|
|
if (ctx->signInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"signInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_SignInfo_toDb(ctx->signInfo, dbT);
|
|
}
|
|
|
|
if (ctx->encryptKeyInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"encryptKeyInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_KeyInfo_toDb(ctx->encryptKeyInfo, dbT);
|
|
}
|
|
if (ctx->decryptKeyInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"decryptKeyInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_KeyInfo_toDb(ctx->decryptKeyInfo, dbT);
|
|
}
|
|
if (ctx->cryptInfo) {
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS,
|
|
"cryptInfo");
|
|
assert(dbT);
|
|
GWEN_CryptToken_CryptInfo_toDb(ctx->cryptInfo, dbT);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXT *GWEN_CryptToken_Context__fromXml(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_XMLNODE *n){
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
GWEN_XMLNODE *nn;
|
|
const char *s;
|
|
int j;
|
|
|
|
assert(n);
|
|
|
|
ctx=GWEN_CryptToken_Context_new();
|
|
ctx->id=GWEN_XMLNode_GetIntValue(n, "id", 0);
|
|
s=GWEN_XMLNode_GetCharValue(n, "contextType", 0);
|
|
if (s)
|
|
ctx->contextType=GWEN_CryptToken_ContextType_fromString(s);
|
|
else
|
|
ctx->contextType=GWEN_CryptToken_ContextType_Unknown;
|
|
s=GWEN_XMLNode_GetCharValue(n, "description", 0);
|
|
if (s)
|
|
ctx->description=strdup(s);
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "signKeyInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->signKeyInfo=GWEN_CryptToken_KeyInfo_fromXml(nn);
|
|
assert(ctx->signKeyInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
sscanf(s, "%i", &j);
|
|
ki=GWEN_CryptToken_GetKeyInfoById(ct, j);
|
|
assert(ki);
|
|
ctx->signKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
}
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "verifyKeyInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->verifyKeyInfo=GWEN_CryptToken_KeyInfo_fromXml(nn);
|
|
assert(ctx->verifyKeyInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
sscanf(s, "%i", &j);
|
|
ki=GWEN_CryptToken_GetKeyInfoById(ct, j);
|
|
assert(ki);
|
|
ctx->verifyKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
}
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "signInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->signInfo=GWEN_CryptToken_SignInfo_fromXml(nn);
|
|
assert(ctx->signInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
sscanf(s, "%i", &j);
|
|
si=GWEN_CryptToken_GetSignInfoById(ct, j);
|
|
assert(si);
|
|
ctx->signInfo=GWEN_CryptToken_SignInfo_dup(si);
|
|
}
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "encryptKeyInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->encryptKeyInfo=GWEN_CryptToken_KeyInfo_fromXml(nn);
|
|
assert(ctx->encryptKeyInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
sscanf(s, "%i", &j);
|
|
ki=GWEN_CryptToken_GetKeyInfoById(ct, j);
|
|
assert(ki);
|
|
ctx->encryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
}
|
|
}
|
|
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "decryptKeyInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->decryptKeyInfo=GWEN_CryptToken_KeyInfo_fromXml(nn);
|
|
assert(ctx->decryptKeyInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
sscanf(s, "%i", &j);
|
|
ki=GWEN_CryptToken_GetKeyInfoById(ct, j);
|
|
assert(ki);
|
|
ctx->decryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
}
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "cryptInfo", 0, 0);
|
|
if (nn) {
|
|
s=GWEN_XMLNode_GetProperty(nn, "id", 0);
|
|
if (!s) {
|
|
ctx->cryptInfo=GWEN_CryptToken_CryptInfo_fromXml(nn);
|
|
assert(ctx->cryptInfo);
|
|
}
|
|
else {
|
|
const GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
sscanf(s, "%i", &j);
|
|
ci=GWEN_CryptToken_GetCryptInfoById(ct, j);
|
|
assert(ci);
|
|
ctx->cryptInfo=GWEN_CryptToken_CryptInfo_dup(ci);
|
|
}
|
|
}
|
|
|
|
return ctx;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32
|
|
GWEN_CryptToken_Context_GetId(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->id;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Context_SetId(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
GWEN_TYPE_UINT32 id){
|
|
assert(ctx);
|
|
ctx->id=id;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CONTEXTTYPE
|
|
GWEN_CryptToken_Context_GetContextType(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->contextType;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Context_SetContextType(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
GWEN_CRYPTTOKEN_CONTEXTTYPE t){
|
|
assert(ctx);
|
|
ctx->contextType=t;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_Context_GetSignKeyInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->signKeyInfo;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
GWEN_CryptToken_Context_SetSignKeyInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ctx);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->signKeyInfo);
|
|
if (ki)
|
|
ctx->signKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
else
|
|
ctx->signKeyInfo=0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_Context_GetVerifyKeyInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->verifyKeyInfo;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
GWEN_CryptToken_Context_SetVerifyKeyInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ctx);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->verifyKeyInfo);
|
|
if (ki)
|
|
ctx->verifyKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
else
|
|
ctx->verifyKeyInfo=0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_Context_GetEncryptKeyInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->encryptKeyInfo;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
GWEN_CryptToken_Context_SetEncryptKeyInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ctx);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->encryptKeyInfo);
|
|
if (ki)
|
|
ctx->encryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
else
|
|
ctx->encryptKeyInfo=0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_Context_GetDecryptKeyInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->decryptKeyInfo;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
GWEN_CryptToken_Context_SetDecryptKeyInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki){
|
|
assert(ctx);
|
|
GWEN_CryptToken_KeyInfo_free(ctx->decryptKeyInfo);
|
|
if (ki)
|
|
ctx->decryptKeyInfo=GWEN_CryptToken_KeyInfo_dup(ki);
|
|
else
|
|
ctx->decryptKeyInfo=0;
|
|
}
|
|
|
|
|
|
|
|
const char*
|
|
GWEN_CryptToken_Context_GetDescription(const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ctx);
|
|
return ctx->description;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Context_SetDescription(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const char *s){
|
|
assert(ctx);
|
|
free(ctx->description);
|
|
if (s)
|
|
ctx->description=strdup(s);
|
|
else
|
|
ctx->description=0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_SIGNINFO*
|
|
GWEN_CryptToken_Context_GetSignInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx) {
|
|
assert(ctx);
|
|
return ctx->signInfo;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Context_SetSignInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_SIGNINFO *si){
|
|
assert(ctx);
|
|
GWEN_CryptToken_SignInfo_free(ctx->signInfo);
|
|
if (si) ctx->signInfo=GWEN_CryptToken_SignInfo_dup(si);
|
|
else ctx->signInfo=0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_CRYPTINFO*
|
|
GWEN_CryptToken_Context_GetCryptInfo(const GWEN_CRYPTTOKEN_CONTEXT *ctx) {
|
|
assert(ctx);
|
|
return ctx->cryptInfo;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
GWEN_CryptToken_Context_SetCryptInfo(GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const GWEN_CRYPTTOKEN_CRYPTINFO *ci) {
|
|
assert(ctx);
|
|
GWEN_CryptToken_CryptInfo_free(ctx->cryptInfo);
|
|
if (ci) ctx->cryptInfo=GWEN_CryptToken_CryptInfo_dup(ci);
|
|
else ctx->cryptInfo=0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* Token functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
|
|
GWEN_CRYPTTOKEN *GWEN_CryptToken_new(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN_DEVICE devType,
|
|
const char *typeName,
|
|
const char *subTypeName,
|
|
const char *name){
|
|
GWEN_CRYPTTOKEN *ct;
|
|
|
|
assert(pm);
|
|
assert(typeName);
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN, ct);
|
|
GWEN_LIST_INIT(GWEN_CRYPTTOKEN, ct);
|
|
GWEN_INHERIT_INIT(GWEN_CRYPTTOKEN, ct);
|
|
|
|
ct->cryptManager=pm;
|
|
ct->deviceType=devType;
|
|
if (name)
|
|
ct->tokenName=strdup(name);
|
|
ct->tokenType=strdup(typeName);
|
|
if (subTypeName)
|
|
ct->tokenSubType=strdup(subTypeName);
|
|
|
|
ct->contextList=GWEN_CryptToken_Context_List_new();
|
|
ct->signInfoList=GWEN_CryptToken_SignInfo_List_new();
|
|
ct->cryptInfoList=GWEN_CryptToken_CryptInfo_List_new();
|
|
ct->keyInfoList=GWEN_CryptToken_KeyInfo_List_new();
|
|
ct->userList=GWEN_CryptToken_User_List_new();
|
|
|
|
return ct;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_free(GWEN_CRYPTTOKEN *ct){
|
|
if (ct) {
|
|
GWEN_INHERIT_FINI(GWEN_CRYPTTOKEN, ct);
|
|
GWEN_LIST_FINI(GWEN_CRYPTTOKEN, ct);
|
|
free(ct->tokenName);
|
|
free(ct->tokenSubType);
|
|
free(ct->tokenType);
|
|
free(ct->descriptiveName);
|
|
GWEN_CryptToken_User_List_free(ct->userList);
|
|
GWEN_CryptToken_Context_List_free(ct->contextList);
|
|
GWEN_CryptToken_SignInfo_List_free(ct->signInfoList);
|
|
GWEN_CryptToken_CryptInfo_List_free(ct->cryptInfoList);
|
|
GWEN_CryptToken_KeyInfo_List_free(ct->keyInfoList);
|
|
GWEN_FREE_OBJECT(ct);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN *GWEN_CryptToken_fromXml(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN_DEVICE devType,
|
|
GWEN_XMLNODE *n) {
|
|
GWEN_CRYPTTOKEN *ct;
|
|
const char *typeName;
|
|
const char *subTypeName;
|
|
const char *name;
|
|
|
|
typeName=GWEN_XMLNode_GetProperty(n, "typeName", 0);
|
|
subTypeName=GWEN_XMLNode_GetProperty(n, "subTypeName", 0);
|
|
name=GWEN_XMLNode_GetProperty(n, "name", 0);
|
|
if (!typeName || !*typeName || !name || !*name) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Missing name or typeName");
|
|
return 0;
|
|
}
|
|
|
|
ct=GWEN_CryptToken_new(pm, devType, typeName, subTypeName, name);
|
|
if (GWEN_CryptToken_ReadXml(ct, n)) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here");
|
|
GWEN_CryptToken_free(ct);
|
|
return 0;
|
|
}
|
|
|
|
return ct;
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32 GWEN_CryptToken_Flag_fromString(const char *s) {
|
|
assert(s);
|
|
if (strcasecmp(s, "manages_signseq")==0)
|
|
return GWEN_CRYPTTOKEN_FLAGS_MANAGES_SIGNSEQ;
|
|
else if (strcasecmp(s, "predef_context_only")==0)
|
|
return GWEN_CRYPTTOKEN_FLAGS_PREDEF_CONTEXT_ONLY;
|
|
else if (strcasecmp(s, "disable_smaller_signature")==0)
|
|
return GWEN_CRYPTTOKEN_FLAGS_DISABLE_SMALLER_SIGNATURE;
|
|
else if (strcasecmp(s, "force_pin_entry")==0)
|
|
return GWEN_CRYPTTOKEN_FLAGS_FORCE_PIN_ENTRY;
|
|
else {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "Unknown flag \"%s\"", s);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Flags_toDb(GWEN_DB_NODE *db,
|
|
const char *n,
|
|
GWEN_TYPE_UINT32 flags) {
|
|
GWEN_DB_DeleteVar(db, n);
|
|
|
|
if (flags & GWEN_CRYPTTOKEN_FLAGS_MANAGES_SIGNSEQ)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
n, "manages_signseq");
|
|
if (flags & GWEN_CRYPTTOKEN_FLAGS_PREDEF_CONTEXT_ONLY)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
n, "predef_context_only");
|
|
if (flags & GWEN_CRYPTTOKEN_FLAGS_DISABLE_SMALLER_SIGNATURE)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
n, "disable_smaller_signature");
|
|
if (flags & GWEN_CRYPTTOKEN_FLAGS_FORCE_PIN_ENTRY)
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
n, "force_pin_entry");
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32 GWEN_CryptToken_Flags_fromDb(GWEN_DB_NODE *db,
|
|
const char *n) {
|
|
int i;
|
|
GWEN_TYPE_UINT32 flags=0;
|
|
const char *s;
|
|
|
|
for (i=0; ; i++) {
|
|
s=GWEN_DB_GetCharValue(db, n, i, 0);
|
|
if (!s)
|
|
break;
|
|
flags|=GWEN_CryptToken_Flag_fromString(s);
|
|
}
|
|
flags=flags;
|
|
|
|
return flags;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_ReadXml(GWEN_CRYPTTOKEN *ct, GWEN_XMLNODE *n) {
|
|
GWEN_XMLNODE *nn;
|
|
const char *s;
|
|
|
|
assert(ct);
|
|
GWEN_CryptToken_Context_List_Clear(ct->contextList);
|
|
GWEN_CryptToken_SignInfo_List_Clear(ct->signInfoList);
|
|
GWEN_CryptToken_CryptInfo_List_Clear(ct->cryptInfoList);
|
|
GWEN_CryptToken_KeyInfo_List_Clear(ct->keyInfoList);
|
|
ct->flags=0;
|
|
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "flags", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "flag", 0, 0);
|
|
while(nnn) {
|
|
GWEN_XMLNODE *nd;
|
|
|
|
nd=GWEN_XMLNode_GetFirstData(nnn);
|
|
if (nd) {
|
|
s=GWEN_XMLNode_GetData(nd);
|
|
assert(s);
|
|
ct->flags|=GWEN_CryptToken_Flag_fromString(s);
|
|
}
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "flag", 0, 0);
|
|
} /* while */
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "flags", 0, 0);
|
|
} /* while */
|
|
|
|
/* read signinfos */
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "signinfos", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "signinfo", 0, 0);
|
|
while(nnn) {
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
si=GWEN_CryptToken_SignInfo_fromXml(nnn);
|
|
assert(si);
|
|
GWEN_CryptToken_SignInfo_List_Add(si, ct->signInfoList);
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "signinfo", 0, 0);
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "signinfos", 0, 0);
|
|
} /* while */
|
|
|
|
/* read cryptinfos */
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "cryptinfos", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "cryptinfo", 0, 0);
|
|
while(nnn) {
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_fromXml(nnn);
|
|
assert(ci);
|
|
GWEN_CryptToken_CryptInfo_List_Add(ci, ct->cryptInfoList);
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "cryptinfo", 0, 0);
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "cryptinfos", 0, 0);
|
|
} /* while */
|
|
|
|
/* read key infos */
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "keyinfos", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "keyinfo", 0, 0);
|
|
while(nnn) {
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
ki=GWEN_CryptToken_KeyInfo_fromXml(nnn);
|
|
assert(ki);
|
|
GWEN_CryptToken_KeyInfo_List_Add(ki, ct->keyInfoList);
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "keyinfo", 0, 0);
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "keyinfos", 0, 0);
|
|
} /* while */
|
|
|
|
/* read contexts */
|
|
nn=GWEN_XMLNode_FindFirstTag(n, "contexts", 0, 0);
|
|
while(nn) {
|
|
GWEN_XMLNODE *nnn;
|
|
|
|
nnn=GWEN_XMLNode_FindFirstTag(nn, "context", 0, 0);
|
|
while(nnn) {
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
|
|
ctx=GWEN_CryptToken_Context__fromXml(ct, nnn);
|
|
assert(ctx);
|
|
GWEN_CryptToken_Context_List_Add(ctx, ct->contextList);
|
|
nnn=GWEN_XMLNode_FindNextTag(nnn, "context", 0, 0);
|
|
}
|
|
|
|
nn=GWEN_XMLNode_FindNextTag(nn, "contexts", 0, 0);
|
|
} /* while */
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
GWEN_PLUGIN_MANAGER*
|
|
GWEN_CryptToken_GetCryptManager(const GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
return ct->cryptManager;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_GetTokenName(const GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
return ct->tokenName;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetTokenName(GWEN_CRYPTTOKEN *ct, const char *s){
|
|
assert(ct);
|
|
free(ct->tokenName);
|
|
if (s) ct->tokenName=strdup(s);
|
|
else ct->tokenName=0;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_GetTokenType(const GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
return ct->tokenType;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_GetTokenSubType(const GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
return ct->tokenSubType;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_DEVICE
|
|
GWEN_CryptToken_GetDeviceType(const GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
return ct->deviceType;
|
|
}
|
|
|
|
|
|
|
|
const char *GWEN_CryptToken_GetDescriptiveName(const GWEN_CRYPTTOKEN *ct) {
|
|
assert(ct);
|
|
return ct->descriptiveName;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetDescriptiveName(GWEN_CRYPTTOKEN *ct, const char *s) {
|
|
assert(ct);
|
|
free(ct->descriptiveName);
|
|
if (s) ct->descriptiveName=strdup(s);
|
|
else ct->descriptiveName=0;
|
|
}
|
|
|
|
|
|
|
|
GWEN_TYPE_UINT32 GWEN_CryptToken_GetFlags(const GWEN_CRYPTTOKEN *ct) {
|
|
assert(ct);
|
|
return ct->flags;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFlags(GWEN_CRYPTTOKEN *ct, GWEN_TYPE_UINT32 fl) {
|
|
assert(ct);
|
|
ct->flags=fl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_AddFlags(GWEN_CRYPTTOKEN *ct, GWEN_TYPE_UINT32 fl) {
|
|
assert(ct);
|
|
ct->flags|=fl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SubFlags(GWEN_CRYPTTOKEN *ct, GWEN_TYPE_UINT32 fl) {
|
|
assert(ct);
|
|
ct->flags&=~fl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetOpenFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_OPEN_FN fn){
|
|
assert(ct);
|
|
ct->openFn=fn;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_OPEN_FN
|
|
GWEN_CryptToken_GetOpenFn(const GWEN_CRYPTTOKEN *ct) {
|
|
assert(ct);
|
|
return ct->openFn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetCreateFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CREATE_FN fn){
|
|
assert(ct);
|
|
ct->createFn=fn;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CREATE_FN
|
|
GWEN_CryptToken_GetCreateFn(const GWEN_CRYPTTOKEN *ct) {
|
|
assert(ct);
|
|
return ct->createFn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetCloseFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CLOSE_FN fn) {
|
|
assert(ct);
|
|
ct->closeFn=fn;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_CLOSE_FN
|
|
GWEN_CryptToken_GetCloseFn(const GWEN_CRYPTTOKEN *ct) {
|
|
assert(ct);
|
|
return ct->closeFn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetChangePinFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CHANGEPIN_FN fn){
|
|
assert(ct);
|
|
ct->changePinFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetSignFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_SIGN_FN fn){
|
|
assert(ct);
|
|
ct->signFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetVerifyFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_VERIFY_FN fn){
|
|
assert(ct);
|
|
ct->verifyFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetEncryptFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_ENCRYPT_FN fn){
|
|
assert(ct);
|
|
ct->encryptFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetDecryptFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_DECRYPT_FN fn){
|
|
assert(ct);
|
|
ct->decryptFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetReadKeyFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_READKEY_FN fn){
|
|
assert(ct);
|
|
ct->readKeyFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetWriteKeyFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_WRITEKEY_FN fn){
|
|
assert(ct);
|
|
ct->writeKeyFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetReadKeySpecFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_READKEYSPEC_FN fn){
|
|
assert(ct);
|
|
ct->readKeySpecFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetWriteKeySpecFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_WRITEKEYSPEC_FN fn){
|
|
assert(ct);
|
|
ct->writeKeySpecFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetGenerateKeyFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_GENERATEKEY_FN fn){
|
|
assert(ct);
|
|
ct->generateKeyFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFillContextListFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_FILLCONTEXTLIST_FN fn){
|
|
assert(ct);
|
|
ct->fillContextListFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFillSignInfoListFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_FILLSIGNINFOLIST_FN fn){
|
|
assert(ct);
|
|
ct->fillSignInfoListFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFillCryptInfoListFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_FILLCRYPTINFOLIST_FN fn){
|
|
assert(ct);
|
|
ct->fillCryptInfoListFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFillKeyInfoListFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_FILLKEYINFOLIST_FN fn){
|
|
assert(ct);
|
|
ct->fillKeyInfoListFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetFillUserListFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_FILLUSERLIST_FN fn){
|
|
assert(ct);
|
|
ct->fillUserListFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetGetSignSeqFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_GETSIGNSEQ_FN fn){
|
|
assert(ct);
|
|
ct->getSignSeqFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetModifyUserFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_MODIFYUSER_FN fn) {
|
|
assert(ct);
|
|
ct->modifyUserFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_SetGetTokenIdDataFn(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_GETTOKENIDDATA_FN fn){
|
|
assert(ct);
|
|
ct->getTokenIdDataFn=fn;
|
|
}
|
|
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Open(GWEN_CRYPTTOKEN *ct, int manage){
|
|
int rv;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Already open");
|
|
return GWEN_ERROR_OPEN;
|
|
}
|
|
if (ct->openFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
rv=ct->openFn(ct, manage);
|
|
if (rv)
|
|
return rv;
|
|
ct->isOpen=1;
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Create(GWEN_CRYPTTOKEN *ct){
|
|
int rv;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Already open");
|
|
return GWEN_ERROR_OPEN;
|
|
}
|
|
if (ct->createFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
rv=ct->createFn(ct);
|
|
if (rv)
|
|
return rv;
|
|
ct->isOpen=1;
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Close(GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->closeFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->closeFn(ct);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_ChangePin(GWEN_CRYPTTOKEN *ct){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->changePinFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->changePinFn(ct);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Sign(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const char *ptr,
|
|
unsigned int len,
|
|
GWEN_BUFFER *dst){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->signFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->signFn(ct, ctx, ptr, len, dst);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Verify(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const char *ptr,
|
|
unsigned int len,
|
|
const char *sigptr,
|
|
unsigned int siglen) {
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->verifyFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->verifyFn(ct, ctx, ptr, len, sigptr, siglen);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Encrypt(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const char *ptr,
|
|
unsigned int len,
|
|
GWEN_BUFFER *dst){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->encryptFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->encryptFn(ct, ctx, ptr, len, dst);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Decrypt(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_CONTEXT *ctx,
|
|
const char *ptr,
|
|
unsigned int len,
|
|
GWEN_BUFFER *dst){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->decryptFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->decryptFn(ct, ctx, ptr, len, dst);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_ReadKey(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid,
|
|
GWEN_CRYPTKEY **key){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->readKeyFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->readKeyFn(ct, kid, key);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_WriteKey(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid,
|
|
const GWEN_CRYPTKEY *key){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->writeKeyFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->writeKeyFn(ct, kid, key);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_ReadKeySpec(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid,
|
|
GWEN_KEYSPEC **ks) {
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->readKeySpecFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->readKeySpecFn(ct, kid, ks);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_WriteKeySpec(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid,
|
|
const GWEN_KEYSPEC *ks) {
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->writeKeySpecFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->writeKeySpecFn(ct, kid, ks);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_GetSignSeq(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid,
|
|
GWEN_TYPE_UINT32 *signSeq){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->getSignSeqFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->getSignSeqFn(ct, kid, signSeq);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_AddContext(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_CONTEXT *ctx){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
GWEN_CryptToken_Context_List_Add(GWEN_CryptToken_Context_dup(ctx),
|
|
ct->contextList);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_FillContextList(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CONTEXT_LIST *l){
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
|
|
if (GWEN_CryptToken_Context_List_GetCount(ct->contextList)==0) {
|
|
int rv;
|
|
|
|
if (ct->fillContextListFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
rv=ct->fillContextListFn(ct, ct->contextList);
|
|
if (rv)
|
|
return rv;
|
|
}
|
|
|
|
ctx=GWEN_CryptToken_Context_List_First(ct->contextList);
|
|
while(ctx) {
|
|
GWEN_CryptToken_Context_List_Add(GWEN_CryptToken_Context_dup(ctx), l);
|
|
ctx=GWEN_CryptToken_Context_List_Next(ctx);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_FillSignInfoList(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_SIGNINFO_LIST *l){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->fillSignInfoListFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
if (GWEN_CryptToken_SignInfo_List_GetCount(ct->signInfoList)==0) {
|
|
int rv;
|
|
|
|
rv=ct->fillSignInfoListFn(ct, ct->signInfoList);
|
|
if (rv)
|
|
return rv;
|
|
}
|
|
|
|
si=GWEN_CryptToken_SignInfo_List_First(ct->signInfoList);
|
|
while(si) {
|
|
GWEN_CryptToken_SignInfo_List_Add(GWEN_CryptToken_SignInfo_dup(si), l);
|
|
si=GWEN_CryptToken_SignInfo_List_Next(si);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_FillCryptInfoList(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CRYPTINFO_LIST *l){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->fillCryptInfoListFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
if (GWEN_CryptToken_CryptInfo_List_GetCount(ct->cryptInfoList)==0) {
|
|
int rv;
|
|
|
|
rv=ct->fillCryptInfoListFn(ct, ct->cryptInfoList);
|
|
if (rv)
|
|
return rv;
|
|
}
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_List_First(ct->cryptInfoList);
|
|
while(ci) {
|
|
GWEN_CryptToken_CryptInfo_List_Add(GWEN_CryptToken_CryptInfo_dup(ci), l);
|
|
ci=GWEN_CryptToken_CryptInfo_List_Next(ci);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_FillKeyInfoList(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_KEYINFO_LIST *l){
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->fillKeyInfoListFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
if (GWEN_CryptToken_KeyInfo_List_GetCount(ct->keyInfoList)==0) {
|
|
int rv;
|
|
|
|
rv=ct->fillKeyInfoListFn(ct, ct->keyInfoList);
|
|
if (rv)
|
|
return rv;
|
|
}
|
|
|
|
ki=GWEN_CryptToken_KeyInfo_List_First(ct->keyInfoList);
|
|
while(ki) {
|
|
GWEN_CryptToken_KeyInfo_List_Add(GWEN_CryptToken_KeyInfo_dup(ki), l);
|
|
ki=GWEN_CryptToken_KeyInfo_List_Next(ki);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_GenerateKey(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_KEYINFO *ki,
|
|
GWEN_CRYPTKEY **key){
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
if (ct->generateKeyFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return ct->generateKeyFn(ct, ki, key);
|
|
}
|
|
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_SIGNINFO*
|
|
GWEN_CryptToken_GetSignInfoByAlgos(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_HASHALGO hashAlgo,
|
|
GWEN_CRYPTTOKEN_PADDALGO paddAlgo){
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_SignInfo_List_GetCount(ct->signInfoList)==0) {
|
|
if (ct->fillSignInfoListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillSignInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillSignInfoListFn(ct, ct->signInfoList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
si=GWEN_CryptToken_SignInfo_List_First(ct->signInfoList);
|
|
while(si) {
|
|
if ((hashAlgo==0 || hashAlgo==GWEN_CryptToken_SignInfo_GetHashAlgo(si)) &&
|
|
(paddAlgo==0 || paddAlgo==GWEN_CryptToken_SignInfo_GetPaddAlgo(si)))
|
|
return si;
|
|
si=GWEN_CryptToken_SignInfo_List_Next(si);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_SIGNINFO*
|
|
GWEN_CryptToken_GetSignInfoById(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 id) {
|
|
GWEN_CRYPTTOKEN_SIGNINFO *si;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_SignInfo_List_GetCount(ct->signInfoList)==0) {
|
|
if (ct->fillSignInfoListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillSignInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillSignInfoListFn(ct, ct->signInfoList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
si=GWEN_CryptToken_SignInfo_List_First(ct->signInfoList);
|
|
while(si) {
|
|
if (id==0 || id==GWEN_CryptToken_SignInfo_GetId(si))
|
|
return si;
|
|
si=GWEN_CryptToken_SignInfo_List_Next(si);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_CRYPTINFO*
|
|
GWEN_CryptToken_GetCryptInfoByAlgos(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_CRYPTALGO cryptAlgo,
|
|
GWEN_CRYPTTOKEN_PADDALGO paddAlgo){
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_CryptInfo_List_GetCount(ct->cryptInfoList)==0) {
|
|
if (ct->fillCryptInfoListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillCryptInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillCryptInfoListFn(ct, ct->cryptInfoList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_List_First(ct->cryptInfoList);
|
|
while(ci) {
|
|
if ((cryptAlgo==0 || cryptAlgo==GWEN_CryptToken_CryptInfo_GetCryptAlgo(ci))
|
|
&&
|
|
(paddAlgo==0 || paddAlgo==GWEN_CryptToken_CryptInfo_GetPaddAlgo(ci)))
|
|
return ci;
|
|
ci=GWEN_CryptToken_CryptInfo_List_Next(ci);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_CRYPTINFO*
|
|
GWEN_CryptToken_GetCryptInfoById(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 id) {
|
|
GWEN_CRYPTTOKEN_CRYPTINFO *ci;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_CryptInfo_List_GetCount(ct->cryptInfoList)==0) {
|
|
if (ct->fillCryptInfoListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillCryptInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillCryptInfoListFn(ct, ct->cryptInfoList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
ci=GWEN_CryptToken_CryptInfo_List_First(ct->cryptInfoList);
|
|
while(ci) {
|
|
if (id==0 || id==GWEN_CryptToken_CryptInfo_GetId(ci))
|
|
return ci;
|
|
ci=GWEN_CryptToken_CryptInfo_List_Next(ci);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_KEYINFO*
|
|
GWEN_CryptToken_GetKeyInfoById(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 kid){
|
|
GWEN_CRYPTTOKEN_KEYINFO *ki;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_KeyInfo_List_GetCount(ct->keyInfoList)==0) {
|
|
if (ct->fillKeyInfoListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillKeyInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillKeyInfoListFn(ct, ct->keyInfoList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
ki=GWEN_CryptToken_KeyInfo_List_First(ct->keyInfoList);
|
|
while(ki) {
|
|
if (kid==0 || kid==(GWEN_TYPE_UINT32)GWEN_CryptToken_KeyInfo_GetKeyId(ki))
|
|
return ki;
|
|
ki=GWEN_CryptToken_KeyInfo_List_Next(ki);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
const GWEN_CRYPTTOKEN_CONTEXT*
|
|
GWEN_CryptToken_GetContextById(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_TYPE_UINT32 id){
|
|
GWEN_CRYPTTOKEN_CONTEXT *ctx;
|
|
|
|
assert(ct);
|
|
|
|
if (GWEN_CryptToken_Context_List_GetCount(ct->contextList)==0) {
|
|
if (ct->fillContextListFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "fillKeyInfoListFn not set");
|
|
return 0;
|
|
}
|
|
else {
|
|
int rv;
|
|
|
|
rv=ct->fillContextListFn(ct, ct->contextList);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
ctx=GWEN_CryptToken_Context_List_First(ct->contextList);
|
|
while(ctx) {
|
|
if (id==0 || id==GWEN_CryptToken_Context_GetId(ctx))
|
|
return ctx;
|
|
ctx=GWEN_CryptToken_Context_List_Next(ctx);
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_FillUserList(GWEN_CRYPTTOKEN *ct,
|
|
GWEN_CRYPTTOKEN_USER_LIST *ul) {
|
|
GWEN_CRYPTTOKEN_USER *u;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return GWEN_ERROR_NOT_OPEN;
|
|
}
|
|
|
|
if (GWEN_CryptToken_User_List_GetCount(ct->userList)==0) {
|
|
int rv;
|
|
|
|
if (ct->fillUserListFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
rv=ct->fillUserListFn(ct, ct->userList);
|
|
if (rv)
|
|
return rv;
|
|
}
|
|
|
|
if (ul) {
|
|
u=GWEN_CryptToken_User_List_First(ct->userList);
|
|
while(u) {
|
|
GWEN_CryptToken_User_List_Add(GWEN_CryptToken_User_dup(u), ul);
|
|
u=GWEN_CryptToken_User_List_Next(u);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_ModifyUser(GWEN_CRYPTTOKEN *ct,
|
|
const GWEN_CRYPTTOKEN_USER *u) {
|
|
int rv;
|
|
GWEN_TYPE_UINT32 id;
|
|
GWEN_CRYPTTOKEN_USER *ou;
|
|
const char *s;
|
|
int i;
|
|
|
|
assert(ct);
|
|
if (ct->isOpen==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Not open");
|
|
return 0;
|
|
}
|
|
assert(u);
|
|
|
|
id=GWEN_CryptToken_User_GetId(u);
|
|
if (id==0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Invalid id");
|
|
return GWEN_ERROR_INVALID;
|
|
}
|
|
|
|
/* make sure we have a valid list of users */
|
|
GWEN_CryptToken_FillUserList(ct, 0);
|
|
|
|
ou=GWEN_CryptToken_User_List_First(ct->userList);
|
|
while(ou) {
|
|
if (id==GWEN_CryptToken_User_GetId(ou))
|
|
break;
|
|
}
|
|
if (!ou) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Unknown user");
|
|
return GWEN_ERROR_INVALID;
|
|
}
|
|
|
|
if (ct->modifyUserFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
rv=ct->modifyUserFn(ct, u);
|
|
if (rv) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here");
|
|
return rv;
|
|
}
|
|
|
|
/* copy data to stored user */
|
|
s=GWEN_CryptToken_User_GetUserId(u);
|
|
GWEN_CryptToken_User_SetUserId(ou, s);
|
|
|
|
s=GWEN_CryptToken_User_GetUserName(u);
|
|
GWEN_CryptToken_User_SetUserName(ou, s);
|
|
|
|
s=GWEN_CryptToken_User_GetPeerId(u);
|
|
GWEN_CryptToken_User_SetPeerId(ou, s);
|
|
|
|
s=GWEN_CryptToken_User_GetPeerName(u);
|
|
GWEN_CryptToken_User_SetPeerName(ou, s);
|
|
|
|
s=GWEN_CryptToken_User_GetAddress(u);
|
|
GWEN_CryptToken_User_SetAddress(ou, s);
|
|
|
|
i=GWEN_CryptToken_User_GetPort(u);
|
|
GWEN_CryptToken_User_SetPort(ou, i);
|
|
|
|
id=GWEN_CryptToken_User_GetContextId(u);
|
|
GWEN_CryptToken_User_SetContextId(ou, id);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_GetTokenIdData(GWEN_CRYPTTOKEN *ct, GWEN_BUFFER *buf) {
|
|
assert(ct);
|
|
assert(buf);
|
|
|
|
if (ct->getTokenIdDataFn==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "No getTokenIdData function set");
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
}
|
|
return ct->getTokenIdDataFn(ct, buf);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Hash(GWEN_CRYPTTOKEN_HASHALGO algo,
|
|
const char *src,
|
|
unsigned int slen,
|
|
GWEN_BUFFER *dstBuf) {
|
|
int rv;
|
|
|
|
assert(src);
|
|
assert(slen);
|
|
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Hashing with algo \"%s\"",
|
|
GWEN_CryptToken_HashAlgo_toString(algo));
|
|
|
|
switch(algo) {
|
|
case GWEN_CryptToken_HashAlgo_None:
|
|
GWEN_Buffer_AppendBytes(dstBuf, src, slen);
|
|
rv=0;
|
|
break;
|
|
|
|
case GWEN_CryptToken_HashAlgo_SHA1:
|
|
rv=GWEN_MD_HashToBuffer("sha1", src, slen, dstBuf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_HashAlgo_RMD160:
|
|
rv=GWEN_MD_HashToBuffer("rmd160", src, slen, dstBuf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_HashAlgo_MD5:
|
|
rv=GWEN_MD_HashToBuffer("md5", src, slen, dstBuf);
|
|
break;
|
|
|
|
default:
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Algo-Type %d (%s) not supported",
|
|
algo, GWEN_CryptToken_HashAlgo_toString(algo));
|
|
return GWEN_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Error hashing with algo %d (%s)",
|
|
algo, GWEN_CryptToken_HashAlgo_toString(algo));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Padd(GWEN_CRYPTTOKEN_PADDALGO algo,
|
|
unsigned int chunkSize,
|
|
GWEN_BUFFER *buf) {
|
|
int rv;
|
|
unsigned int diff;
|
|
unsigned bsize;
|
|
unsigned dstSize;
|
|
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Padding with algo \"%s\"",
|
|
GWEN_CryptToken_PaddAlgo_toString(algo));
|
|
|
|
assert(buf);
|
|
bsize=GWEN_Buffer_GetUsedBytes(buf);
|
|
dstSize=bsize+(chunkSize-1);
|
|
dstSize=(dstSize/chunkSize)*chunkSize;
|
|
diff=dstSize-GWEN_Buffer_GetUsedBytes(buf);
|
|
|
|
switch(algo) {
|
|
case GWEN_CryptToken_PaddAlgo_None:
|
|
rv=0;
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1A4:
|
|
if (dstSize>96) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN,
|
|
"Padding size must be <=96 bytes (is %d)",
|
|
dstSize);
|
|
return GWEN_ERROR_INVALID;
|
|
}
|
|
rv=GWEN_Padd_PaddWithISO9796(buf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_LeftZero:
|
|
rv=GWEN_Buffer_FillLeftWithBytes(buf, 0, diff);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_RightZero:
|
|
rv=GWEN_Buffer_FillWithBytes(buf, 0, diff);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ANSIX9_23:
|
|
if (dstSize % 8) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN,
|
|
"Padding size must be multiple of 8 (is %d)", dstSize);
|
|
return GWEN_ERROR_INVALID;
|
|
}
|
|
rv=GWEN_Padd_PaddWithANSIX9_23(buf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_1:
|
|
rv=GWEN_Padd_PaddWithPkcs1Bt1(buf, dstSize);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_2:
|
|
rv=GWEN_Padd_PaddWithPkcs1Bt2(buf, dstSize);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1:
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_2:
|
|
default:
|
|
DBG_INFO(GWEN_LOGDOMAIN, "Algo-Type %d (%s) not supported",
|
|
algo, GWEN_CryptToken_PaddAlgo_toString(algo));
|
|
return GWEN_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Error padding with algo %d (%s)",
|
|
algo, GWEN_CryptToken_PaddAlgo_toString(algo));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Unpadd(GWEN_CRYPTTOKEN_PADDALGO algo,
|
|
GWEN_BUFFER *buf) {
|
|
int rv;
|
|
|
|
assert(buf);
|
|
|
|
switch(algo) {
|
|
case GWEN_CryptToken_PaddAlgo_None:
|
|
rv=0;
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1A4:
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Unpadding with ISO9796_1A4 not possible");
|
|
return GWEN_ERROR_INVALID;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_LeftZero:
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Unpadding with LeftZero not possible");
|
|
return GWEN_ERROR_INVALID;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_RightZero:
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Unpadding with RightZero not possible");
|
|
return GWEN_ERROR_INVALID;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ANSIX9_23:
|
|
rv=GWEN_Padd_UnpaddWithANSIX9_23(buf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_1:
|
|
rv=GWEN_Padd_UnpaddWithPkcs1Bt1(buf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_PKCS1_2:
|
|
rv=GWEN_Padd_UnpaddWithPkcs1Bt2(buf);
|
|
break;
|
|
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_1:
|
|
case GWEN_CryptToken_PaddAlgo_ISO9796_2:
|
|
default:
|
|
DBG_INFO(GWEN_LOGDOMAIN, "Algo-Type %d (%s) not supported",
|
|
algo, GWEN_CryptToken_PaddAlgo_toString(algo));
|
|
return GWEN_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Error unpadding with algo %d (%s)",
|
|
algo, GWEN_CryptToken_PaddAlgo_toString(algo));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* CryptToken_Plugin functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
GWEN_INHERIT(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN)
|
|
|
|
|
|
GWEN_PLUGIN *GWEN_CryptToken_Plugin_new(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN_DEVICE devType,
|
|
const char *typeName,
|
|
const char *fileName) {
|
|
GWEN_PLUGIN *pl;
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pm);
|
|
pl=GWEN_Plugin_new(pm, typeName, fileName);
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTTOKEN_PLUGIN, ctp);
|
|
GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl, ctp,
|
|
GWEN_CryptToken_Plugin_FreeData);
|
|
ctp->devType=devType;
|
|
return pl;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Plugin_FreeData(void *bp, void *p){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
ctp=(GWEN_CRYPTTOKEN_PLUGIN*)p;
|
|
GWEN_FREE_OBJECT(ctp);
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN_DEVICE
|
|
GWEN_CryptToken_Plugin_GetDeviceType(const GWEN_PLUGIN *pl){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pl);
|
|
ctp=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl);
|
|
assert(ctp);
|
|
|
|
return ctp->devType;
|
|
}
|
|
|
|
|
|
|
|
GWEN_CRYPTTOKEN*
|
|
GWEN_CryptToken_Plugin_CreateToken(GWEN_PLUGIN *pl,
|
|
const char *subTypeName,
|
|
const char *name){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pl);
|
|
ctp=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl);
|
|
assert(ctp);
|
|
|
|
if (ctp->createTokenFn==0) {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "No createToken function set");
|
|
return 0;
|
|
}
|
|
return ctp->createTokenFn(pl, subTypeName, name);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptToken_Plugin_CheckToken(GWEN_PLUGIN *pl,
|
|
GWEN_BUFFER *subTypeName,
|
|
GWEN_BUFFER *name){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pl);
|
|
ctp=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl);
|
|
assert(ctp);
|
|
|
|
if (ctp->checkTokenFn==0) {
|
|
DBG_WARN(GWEN_LOGDOMAIN, "No checkToken function set");
|
|
return GWEN_ERROR_CT_NOT_IMPLEMENTED;
|
|
}
|
|
return ctp->checkTokenFn(pl, subTypeName, name);
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Plugin_SetCreateTokenFn(GWEN_PLUGIN *pl,
|
|
GWEN_CRYPTTOKEN_PLUGIN_CREATETOKEN_FN fn){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pl);
|
|
ctp=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl);
|
|
assert(ctp);
|
|
|
|
ctp->createTokenFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptToken_Plugin_SetCheckTokenFn(GWEN_PLUGIN *pl,
|
|
GWEN_CRYPTTOKEN_PLUGIN_CHECKTOKEN_FN fn){
|
|
GWEN_CRYPTTOKEN_PLUGIN *ctp;
|
|
|
|
assert(pl);
|
|
ctp=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CRYPTTOKEN_PLUGIN, pl);
|
|
assert(ctp);
|
|
|
|
ctp->checkTokenFn=fn;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* _________________________________________________________________________
|
|
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
* CryptManager functions
|
|
* YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
*/
|
|
|
|
GWEN_INHERIT(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER)
|
|
|
|
|
|
GWEN_PLUGIN_MANAGER *GWEN_CryptManager_new(){
|
|
GWEN_PLUGIN_MANAGER *pm;
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
pm=GWEN_PluginManager_new(GWEN_CRYPTMANAGER_NAME);
|
|
GWEN_NEW_OBJECT(GWEN_CRYPTMANAGER, cm);
|
|
GWEN_INHERIT_SETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm, cm,
|
|
GWEN_CryptManager_FreeData);
|
|
|
|
return pm;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_FreeData(void *bp, void *p) {
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
cm=(GWEN_CRYPTMANAGER*)p;
|
|
GWEN_FREE_OBJECT(cm);
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetGetPinFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_GETPIN_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
cm->getPinFn=fn;
|
|
}
|
|
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetBeginEnterPinFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_BEGIN_ENTER_PIN_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
cm->beginEnterPinFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetEndEnterPinFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_END_ENTER_PIN_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
cm->endEnterPinFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetInsertTokenFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_INSERT_TOKEN_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
cm->insertTokenFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetInsertCorrectTokenFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_INSERT_CORRECT_TOKEN_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
cm->insertCorrectTokenFn=fn;
|
|
}
|
|
|
|
|
|
|
|
void GWEN_CryptManager_SetShowMessageFn(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTMANAGER_SHOW_MESSAGE_FN fn){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
cm->showMessageFn=fn;
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_GetPin(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token,
|
|
GWEN_CRYPTTOKEN_PINTYPE pt,
|
|
GWEN_CRYPTTOKEN_PINENCODING pe,
|
|
GWEN_TYPE_UINT32 flags,
|
|
unsigned char *buffer,
|
|
unsigned int minLength,
|
|
unsigned int maxLength,
|
|
unsigned int *pinLength){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->getPinFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->getPinFn(pm, token, pt, pe, flags, buffer,
|
|
minLength, maxLength, pinLength);
|
|
}
|
|
|
|
|
|
|
|
|
|
int GWEN_CryptManager_BeginEnterPin(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token,
|
|
GWEN_CRYPTTOKEN_PINTYPE pt){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->beginEnterPinFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->beginEnterPinFn(pm, token, pt);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_EndEnterPin(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token,
|
|
GWEN_CRYPTTOKEN_PINTYPE pt,
|
|
int ok){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->endEnterPinFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->endEnterPinFn(pm, token, pt, ok);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_InsertToken(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->insertTokenFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->insertTokenFn(pm, token);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_InsertCorrectToken(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->insertCorrectTokenFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->insertCorrectTokenFn(pm, token);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_ShowMessage(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN *token,
|
|
const char *title,
|
|
const char *msg){
|
|
GWEN_CRYPTMANAGER *cm;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
if (cm->showMessageFn==0)
|
|
return GWEN_ERROR_UNSUPPORTED;
|
|
return cm->showMessageFn(pm, token, title, msg);
|
|
}
|
|
|
|
|
|
|
|
int GWEN_CryptManager_CheckToken(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN_DEVICE devt,
|
|
GWEN_BUFFER *typeName,
|
|
GWEN_BUFFER *subTypeName,
|
|
GWEN_BUFFER *tokenName) {
|
|
GWEN_CRYPTMANAGER *cm;
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2 *pdl;
|
|
|
|
assert(pm);
|
|
cm=GWEN_INHERIT_GETDATA(GWEN_PLUGIN_MANAGER, GWEN_CRYPTMANAGER, pm);
|
|
assert(cm);
|
|
|
|
pdl=GWEN_PluginManager_GetPluginDescrs(pm);
|
|
if (pdl==0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "No plugin descriptions found");
|
|
return GWEN_ERROR_NOT_FOUND;
|
|
}
|
|
else {
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit;
|
|
|
|
pit=GWEN_PluginDescription_List2_First(pdl);
|
|
if (pit) {
|
|
GWEN_PLUGIN_DESCRIPTION *pd;
|
|
|
|
pd=GWEN_PluginDescription_List2Iterator_Data(pit);
|
|
assert(pd);
|
|
while(pd) {
|
|
GWEN_XMLNODE *n;
|
|
const char *p;
|
|
GWEN_CRYPTTOKEN_DEVICE currentDevt;
|
|
|
|
n=GWEN_PluginDescription_GetXmlNode(pd);
|
|
assert(n);
|
|
p=GWEN_XMLNode_GetProperty(n, "device", "file");
|
|
if (strcasecmp(p, "file")==0)
|
|
currentDevt=GWEN_CryptToken_Device_File;
|
|
else if (strcasecmp(p, "card")==0)
|
|
currentDevt=GWEN_CryptToken_Device_Card;
|
|
else if (strcasecmp(p, "none")==0)
|
|
currentDevt=GWEN_CryptToken_Device_None;
|
|
else
|
|
currentDevt=GWEN_CryptToken_Device_Unknown;
|
|
|
|
if (currentDevt==devt) {
|
|
GWEN_PLUGIN *pl;
|
|
char logbuffer[256];
|
|
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Loading plugin \"%s\""),
|
|
GWEN_PluginDescription_GetName(pd));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelInfo, logbuffer);
|
|
|
|
/* device type matches, check this plugin */
|
|
pl=GWEN_PluginManager_GetPlugin(pm,
|
|
GWEN_PluginDescription_GetName(pd));
|
|
if (pl) {
|
|
GWEN_BUFFER *lSubTypeName;
|
|
GWEN_BUFFER *lTokenName;
|
|
int rv;
|
|
|
|
lSubTypeName=GWEN_Buffer_dup(subTypeName);
|
|
lTokenName=GWEN_Buffer_dup(tokenName);
|
|
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Checking plugin \"%s\""),
|
|
GWEN_Plugin_GetName(pl));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelNotice, logbuffer);
|
|
|
|
DBG_ERROR(GWEN_LOGDOMAIN,
|
|
"Checking plugin \"%s\"",
|
|
GWEN_Plugin_GetName(pl));
|
|
|
|
rv=GWEN_CryptToken_Plugin_CheckToken(pl,
|
|
lSubTypeName,
|
|
lTokenName);
|
|
switch(rv) {
|
|
case 0:
|
|
/* responsive plugin found */
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Plugin \"%s\" supports this token"),
|
|
GWEN_Plugin_GetName(pl));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelNotice, logbuffer);
|
|
|
|
GWEN_Buffer_Reset(typeName);
|
|
GWEN_Buffer_AppendString(typeName, GWEN_Plugin_GetName(pl));
|
|
GWEN_Buffer_Reset(subTypeName);
|
|
GWEN_Buffer_AppendBuffer(subTypeName, lSubTypeName);
|
|
GWEN_Buffer_Reset(tokenName);
|
|
GWEN_Buffer_AppendBuffer(tokenName, lTokenName);
|
|
GWEN_Buffer_free(lTokenName);
|
|
GWEN_Buffer_free(lSubTypeName);
|
|
GWEN_PluginDescription_List2Iterator_free(pit);
|
|
GWEN_PluginDescription_List2_freeAll(pdl);
|
|
return 0;
|
|
|
|
case GWEN_ERROR_CT_NOT_IMPLEMENTED:
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Plugin \"%s\": Function not implemented"),
|
|
GWEN_Plugin_GetName(pl));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelNotice, logbuffer);
|
|
break;
|
|
|
|
case GWEN_ERROR_CT_NOT_SUPPORTED:
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Plugin \"%s\" does not support this token"),
|
|
GWEN_Plugin_GetName(pl));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelInfo, logbuffer);
|
|
break;
|
|
|
|
case GWEN_ERROR_CT_BAD_NAME:
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Plugin \"%s\" supports this token, but the name "
|
|
"did not match"),
|
|
GWEN_Plugin_GetName(pl));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelInfo, logbuffer);
|
|
break;
|
|
|
|
default:
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Plugin \"%s\": Unexpected error (%d)"),
|
|
GWEN_Plugin_GetName(pl), rv);
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelInfo, logbuffer);
|
|
break;
|
|
} /* switch */
|
|
} /* if plugin loaded */
|
|
else {
|
|
snprintf(logbuffer, sizeof(logbuffer)-1,
|
|
I18N("Could not load plugin \"%s\""),
|
|
GWEN_PluginDescription_GetName(pd));
|
|
logbuffer[sizeof(logbuffer)-1]=0;
|
|
GWEN_WaitCallback_Log(GWEN_LoggerLevelWarning, logbuffer);
|
|
}
|
|
}
|
|
|
|
pd=GWEN_PluginDescription_List2Iterator_Next(pit);
|
|
}
|
|
|
|
GWEN_PluginDescription_List2Iterator_free(pit);
|
|
}
|
|
GWEN_PluginDescription_List2_freeAll(pdl);
|
|
}
|
|
|
|
return GWEN_ERROR_CT_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2*
|
|
GWEN_CryptManager_GetPluginDescrs(GWEN_PLUGIN_MANAGER *pm,
|
|
GWEN_CRYPTTOKEN_DEVICE devt) {
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2 *pl1;
|
|
|
|
pl1=GWEN_PluginManager_GetPluginDescrs(pm);
|
|
if (pl1) {
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit;
|
|
GWEN_PLUGIN_DESCRIPTION_LIST2 *pl2;
|
|
|
|
pl2=GWEN_PluginDescription_List2_new();
|
|
pit=GWEN_PluginDescription_List2_First(pl1);
|
|
if (pit) {
|
|
GWEN_PLUGIN_DESCRIPTION *pd;
|
|
const char *ts;
|
|
|
|
if (devt==GWEN_CryptToken_Device_Any)
|
|
ts=0;
|
|
else
|
|
ts=GWEN_CryptToken_Device_toString(devt);
|
|
pd=GWEN_PluginDescription_List2Iterator_Data(pit);
|
|
while(pd) {
|
|
GWEN_XMLNODE *node;
|
|
const char *nts;
|
|
int match=0;
|
|
|
|
node=GWEN_PluginDescription_GetXmlNode(pd);
|
|
assert(node);
|
|
nts=GWEN_XMLNode_GetProperty(node, "device", 0);
|
|
if (nts) {
|
|
if (!ts || (ts && strcasecmp(ts, nts)==0))
|
|
match=1;
|
|
}
|
|
else if (!ts)
|
|
match=1;
|
|
|
|
if (match) {
|
|
GWEN_PLUGIN_DESCRIPTION *pd2;
|
|
|
|
pd2=GWEN_PluginDescription_dup(pd);
|
|
GWEN_PluginDescription_List2_PushBack(pl2, pd2);
|
|
}
|
|
|
|
pd=GWEN_PluginDescription_List2Iterator_Next(pit);
|
|
}
|
|
GWEN_PluginDescription_List2Iterator_free(pit);
|
|
}
|
|
/* GWEN_PluginDescription_List2_freeAll(pl2); */
|
|
|
|
if (GWEN_PluginDescription_List2_GetSize(pl2)==0) {
|
|
GWEN_PluginDescription_List2_freeAll(pl2);
|
|
DBG_ERROR(GWEN_LOGDOMAIN,
|
|
"No matching plugin descriptions for the given device type");
|
|
return 0;
|
|
}
|
|
return pl2;
|
|
}
|
|
else {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "No plugin descriptions at all");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|