diff -r 000000000000 -r e35f40988205 xmlsecurityengine/xmlseccrypto/src/xmlsecc_crypto.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xmlsecurityengine/xmlseccrypto/src/xmlsecc_crypto.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,302 @@ +/** + * XMLSec library + * + * This is free software; see Copyright file in the source + * distribution for preciese wording. + * + * Copyright (C) 2002-2003 Aleksey Sanin + * Portion Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + */ +#include "xmlsecc_globals.h" + +#include +#include +#include +#include "xmlsecc_config.h" +#include "xmlsec_xmlsec.h" +#include "xmlsec_keys.h" +#include "xmlsec_transforms.h" +#include "xmlsec_errors.h" +#include "xmlsec_dl.h" +#include "xmlsec_private.h" + +#include "xmlsecc_app.h" +#include "xmlsecc_crypto.h" +#include "xmlsecc_cryptowrapper.h" +#include "xmlsecc_evpwrapper.h" +#include "xmlsecc_x509.h" + +static xmlSecCryptoDLFunctionsPtr gXmlSecSymbianCryptoFunctions = NULL; + +/** + * xmlSecCryptoGetFunctions_symbiancrypto: + * + * Gets the pointer to xmlsec-symbiancrypto functions table. + * + * Returns the xmlsec-symbiancrypto functions table or NULL if an error occurs. + */ +xmlSecCryptoDLFunctionsPtr +xmlSecCryptoGetFunctions_symbiancrypto(void) { + static xmlSecCryptoDLFunctions functions; + + if(gXmlSecSymbianCryptoFunctions) { + return(gXmlSecSymbianCryptoFunctions); + } + + memset(&functions, 0, sizeof(functions)); + gXmlSecSymbianCryptoFunctions = &functions; + + /** + * Crypto Init/shutdown + */ + gXmlSecSymbianCryptoFunctions->cryptoInit = xmlSecSymbianCryptoInit; + gXmlSecSymbianCryptoFunctions->cryptoShutdown = xmlSecSymbianCryptoShutdown; + gXmlSecSymbianCryptoFunctions->cryptoKeysMngrInit = xmlSecSymbianCryptoKeysMngrInit; + + /** + * Key data ids + */ +#ifndef XMLSEC_NO_AES + gXmlSecSymbianCryptoFunctions->keyDataAesGetKlass = xmlSecSymbianCryptoKeyDataAesGetKlass; +#endif /* XMLSEC_NO_AES */ + +#ifndef XMLSEC_NO_DES + gXmlSecSymbianCryptoFunctions->keyDataDesGetKlass = xmlSecSymbianCryptoKeyDataDesGetKlass; +#endif /* XMLSEC_NO_DES */ + +#ifndef XMLSEC_NO_HMAC + gXmlSecSymbianCryptoFunctions->keyDataHmacGetKlass = xmlSecSymbianCryptoKeyDataHmacGetKlass; +#endif /* XMLSEC_NO_HMAC */ + +#ifndef XMLSEC_NO_RSA + gXmlSecSymbianCryptoFunctions->keyDataRsaGetKlass = xmlSecSymbianCryptoKeyDataRsaGetKlass; +#endif /* XMLSEC_NO_RSA */ + +#ifndef XMLSEC_NO_X509 + gXmlSecSymbianCryptoFunctions->keyDataX509GetKlass = xmlSecSymbianCryptoKeyDataX509GetKlass; + gXmlSecSymbianCryptoFunctions->keyDataRawX509CertGetKlass + = xmlSecSymbianCryptoKeyDataRawX509CertGetKlass; +#endif /* XMLSEC_NO_X509 */ + + /** + * Key data store ids + */ +#ifndef XMLSEC_NO_X509 + gXmlSecSymbianCryptoFunctions->x509StoreGetKlass = xmlSecSymbianCryptoX509StoreGetKlass; +#endif /* XMLSEC_NO_X509 */ + + /** + * Crypto transforms ids + */ +#ifndef XMLSEC_NO_AES + gXmlSecSymbianCryptoFunctions->transformAes128CbcGetKlass + = xmlSecSymbianCryptoTransformAes128CbcGetKlass; + gXmlSecSymbianCryptoFunctions->transformAes192CbcGetKlass + = xmlSecSymbianCryptoTransformAes192CbcGetKlass; + gXmlSecSymbianCryptoFunctions->transformAes256CbcGetKlass + = xmlSecSymbianCryptoTransformAes256CbcGetKlass; +#endif /* XMLSEC_NO_AES */ + +#ifndef XMLSEC_NO_DES + gXmlSecSymbianCryptoFunctions->transformDes3CbcGetKlass + = xmlSecSymbianCryptoTransformDes3CbcGetKlass; +#endif /* XMLSEC_NO_DES */ + +#ifndef XMLSEC_NO_HMAC + gXmlSecSymbianCryptoFunctions->transformHmacSha1GetKlass + = xmlSecSymbianCryptoTransformHmacSha1GetKlass; + gXmlSecSymbianCryptoFunctions->transformHmacRipemd160GetKlass + = xmlSecSymbianCryptoTransformHmacRipemd160GetKlass; + gXmlSecSymbianCryptoFunctions->transformHmacMd5GetKlass + = xmlSecSymbianCryptoTransformHmacMd5GetKlass; +#endif /* XMLSEC_NO_HMAC */ + +#ifndef XMLSEC_NO_SHA1 + gXmlSecSymbianCryptoFunctions->transformSha1GetKlass + = xmlSecSymbianCryptoTransformSha1GetKlass; +#endif /* XMLSEC_NO_SHA1 */ + + +#ifndef XMLSEC_NO_RSA + gXmlSecSymbianCryptoFunctions->transformRsaSha1GetKlass + = xmlSecSymbianCryptoTransformRsaSha1GetKlass; +#endif /* XMLSEC_NO_RSA */ + + + + + /** + * High level routines form xmlsec command line utility + */ + gXmlSecSymbianCryptoFunctions->cryptoAppInit + = xmlSecSymbianCryptoAppInit; + gXmlSecSymbianCryptoFunctions->cryptoAppShutdown + = xmlSecSymbianCryptoAppShutdown; + gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrInit + = xmlSecSymbianCryptoAppDefaultKeysMngrInit; + gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrAdoptKey + = xmlSecSymbianCryptoAppDefaultKeysMngrAdoptKey; + gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrLoad + = xmlSecSymbianCryptoAppDefaultKeysMngrLoad; + gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrSave + = xmlSecSymbianCryptoAppDefaultKeysMngrSave; +#ifndef XMLSEC_NO_X509 + gXmlSecSymbianCryptoFunctions->cryptoAppKeysMngrCertLoad + = xmlSecSymbianCryptoAppKeysMngrCertLoad; + gXmlSecSymbianCryptoFunctions->cryptoAppPkcs12Load + = xmlSecSymbianCryptoAppPkcs12Load; + gXmlSecSymbianCryptoFunctions->cryptoAppKeyCertLoad + = xmlSecSymbianCryptoAppKeyCertLoad; +#endif /* XMLSEC_NO_X509 */ + gXmlSecSymbianCryptoFunctions->cryptoAppKeyLoadWithName + = xmlSecSymbianCryptoAppKeyLoadWithName; + gXmlSecSymbianCryptoFunctions->cryptoAppDefaultPwdCallback + = (void*)xmlSecSymbianCryptoAppGetDefaultPwdCallback(); + + return(gXmlSecSymbianCryptoFunctions); +} + + +/** + * xmlSecSymbianCryptoInit: + * + * XMLSec library specific crypto engine initialization. + * + * Returns 0 on success or a negative value otherwise. + */ +EXPORT_C +int +xmlSecSymbianCryptoInit (void) { + /* Check loaded xmlsec library version */ + if(xmlSecCheckVersionExact() != 1) { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "xmlSecCheckVersionExact", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + XMLSEC_ERRORS_NO_MESSAGE); + return(-1); + } + + if (sc_pkey_init() != 0) + { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "sc_pkey_init", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + XMLSEC_ERRORS_NO_MESSAGE); + return(-1); + + } + + /* register our klasses */ + if(xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms( + xmlSecCryptoGetFunctions_symbiancrypto()) < 0) { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + XMLSEC_ERRORS_NO_MESSAGE); + return(-1); + } + + return(0); +} + +/** + * xmlSecSymbianCryptoShutdown: + * + * XMLSec library specific crypto engine shutdown. + * + * Returns 0 on success or a negative value otherwise. + */ +EXPORT_C +int +xmlSecSymbianCryptoShutdown(void) { + sc_pkey_shutdown(); + return(0); +} + +/** + * xmlSecSymbianCryptoKeysMngrInit: + * @mngr: the pointer to keys manager. + * + * Adds SymbianCrypto specific key data stores in keys manager. + * + * Returns 0 on success or a negative value otherwise. + */ +EXPORT_C +int +xmlSecSymbianCryptoKeysMngrInit(xmlSecKeysMngrPtr mngr) { + int ret; + + xmlSecAssert2(mngr, -1); + + /* Implementation from OpenSSL */ +#ifndef XMLSEC_NO_X509 + /* create x509 store if needed */ + if(!xmlSecKeysMngrGetDataStore(mngr, xmlSecSymbianCryptoX509StoreId)) { + xmlSecKeyDataStorePtr x509Store; + + x509Store = xmlSecKeyDataStoreCreate(xmlSecSymbianCryptoX509StoreId); + if(!x509Store) { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "xmlSecKeyDataStoreCreate", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + "xmlSecOpenSSLX509StoreId"); + return(-1); + } + + ret = xmlSecKeysMngrAdoptDataStore(mngr, x509Store); + if(ret < 0) { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "xmlSecKeysMngrAdoptDataStore", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + XMLSEC_ERRORS_NO_MESSAGE); + xmlSecKeyDataStoreDestroy(x509Store); + return(-1); + } + } +#endif /* XMLSEC_NO_X509 */ + return(0); +} + +/** + * xmlSecSymbianCryptoGenerateRandom: + * @buffer: the destination buffer. + * @size: the numer of bytes to generate. + * + * Generates @size random bytes and puts result in @buffer. + * + * Returns 0 on success or a negative value otherwise. + */ +EXPORT_C +int +xmlSecSymbianCryptoGenerateRandom(xmlSecBufferPtr buffer, xmlSecSize size) { + int ret; + + xmlSecAssert2(buffer, -1); + xmlSecAssert2(size > 0, -1); + + ret = xmlSecBufferSetSize(buffer, size); + if(ret < 0) { + xmlSecError(XMLSEC_ERRORS_HERE, + NULL, + "xmlSecBufferSetSize", + XMLSEC_ERRORS_R_XMLSEC_FAILED, + "size=%d", size); + return(-1); + } + + /* get random data */ + sc_randomize(xmlSecBufferGetData(buffer), size, SC_STRONG_RANDOM); + /* + CSystemRandom* rand=CSystemRandom::NewLC(); + unsigned char* bytes=xmlSecBufferGetData(buffer); + TPtr8 ptr(bytes, xmlSecBufferGetMaxSize(buffer)); + rand->GenerateBytesL(ptr); + CleanupStack::PopAndDestroy(); + */ + return(0); +}