|         |      1 /**  | 
|         |      2  * XMLSec library | 
|         |      3  * | 
|         |      4  * This is free software; see Copyright file in the source | 
|         |      5  * distribution for preciese wording. | 
|         |      6  *  | 
|         |      7  * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com> | 
|         |      8  * Portion Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.  | 
|         |      9  */ | 
|         |     10 #include "xmlsecc_globals.h" | 
|         |     11  | 
|         |     12 #include <e32def.h> | 
|         |     13 #include <string.h> | 
|         |     14 #include <random.h> | 
|         |     15 #include "xmlsecc_config.h" | 
|         |     16 #include "xmlsec_xmlsec.h" | 
|         |     17 #include "xmlsec_keys.h" | 
|         |     18 #include "xmlsec_transforms.h" | 
|         |     19 #include "xmlsec_errors.h" | 
|         |     20 #include "xmlsec_dl.h" | 
|         |     21 #include "xmlsec_private.h" | 
|         |     22  | 
|         |     23 #include "xmlsecc_app.h" | 
|         |     24 #include "xmlsecc_crypto.h" | 
|         |     25 #include "xmlsecc_cryptowrapper.h" | 
|         |     26 #include "xmlsecc_evpwrapper.h" | 
|         |     27 #include "xmlsecc_x509.h" | 
|         |     28  | 
|         |     29 static xmlSecCryptoDLFunctionsPtr gXmlSecSymbianCryptoFunctions = NULL; | 
|         |     30  | 
|         |     31 /** | 
|         |     32  * xmlSecCryptoGetFunctions_symbiancrypto: | 
|         |     33  * | 
|         |     34  * Gets the pointer to xmlsec-symbiancrypto functions table. | 
|         |     35  * | 
|         |     36  * Returns the xmlsec-symbiancrypto functions table or NULL if an error occurs. | 
|         |     37  */ | 
|         |     38 xmlSecCryptoDLFunctionsPtr | 
|         |     39 xmlSecCryptoGetFunctions_symbiancrypto(void) { | 
|         |     40     static xmlSecCryptoDLFunctions functions; | 
|         |     41      | 
|         |     42     if(gXmlSecSymbianCryptoFunctions) { | 
|         |     43 	return(gXmlSecSymbianCryptoFunctions); | 
|         |     44     } | 
|         |     45  | 
|         |     46     memset(&functions, 0, sizeof(functions)); | 
|         |     47     gXmlSecSymbianCryptoFunctions = &functions; | 
|         |     48  | 
|         |     49     /**   | 
|         |     50      * Crypto Init/shutdown | 
|         |     51      */ | 
|         |     52     gXmlSecSymbianCryptoFunctions->cryptoInit 			= xmlSecSymbianCryptoInit; | 
|         |     53     gXmlSecSymbianCryptoFunctions->cryptoShutdown 		= xmlSecSymbianCryptoShutdown; | 
|         |     54     gXmlSecSymbianCryptoFunctions->cryptoKeysMngrInit 	= xmlSecSymbianCryptoKeysMngrInit; | 
|         |     55  | 
|         |     56     /** | 
|         |     57      * Key data ids | 
|         |     58      */ | 
|         |     59 #ifndef XMLSEC_NO_AES     | 
|         |     60     gXmlSecSymbianCryptoFunctions->keyDataAesGetKlass	= xmlSecSymbianCryptoKeyDataAesGetKlass; | 
|         |     61 #endif /* XMLSEC_NO_AES */ | 
|         |     62  | 
|         |     63 #ifndef XMLSEC_NO_DES     | 
|         |     64     gXmlSecSymbianCryptoFunctions->keyDataDesGetKlass 	= xmlSecSymbianCryptoKeyDataDesGetKlass; | 
|         |     65 #endif /* XMLSEC_NO_DES */ | 
|         |     66  | 
|         |     67 #ifndef XMLSEC_NO_HMAC   | 
|         |     68     gXmlSecSymbianCryptoFunctions->keyDataHmacGetKlass 	= xmlSecSymbianCryptoKeyDataHmacGetKlass; | 
|         |     69 #endif /* XMLSEC_NO_HMAC */    | 
|         |     70  | 
|         |     71 #ifndef XMLSEC_NO_RSA | 
|         |     72 	gXmlSecSymbianCryptoFunctions->keyDataRsaGetKlass 	= xmlSecSymbianCryptoKeyDataRsaGetKlass; | 
|         |     73 #endif /* XMLSEC_NO_RSA */  | 
|         |     74  | 
|         |     75 #ifndef XMLSEC_NO_X509 | 
|         |     76     gXmlSecSymbianCryptoFunctions->keyDataX509GetKlass 	 = xmlSecSymbianCryptoKeyDataX509GetKlass; | 
|         |     77     gXmlSecSymbianCryptoFunctions->keyDataRawX509CertGetKlass 	 | 
|         |     78                                               = xmlSecSymbianCryptoKeyDataRawX509CertGetKlass; | 
|         |     79 #endif /* XMLSEC_NO_X509 */ | 
|         |     80  | 
|         |     81     /** | 
|         |     82      * Key data store ids | 
|         |     83      */ | 
|         |     84 #ifndef XMLSEC_NO_X509 | 
|         |     85     gXmlSecSymbianCryptoFunctions->x509StoreGetKlass 	= xmlSecSymbianCryptoX509StoreGetKlass; | 
|         |     86 #endif /* XMLSEC_NO_X509 */ | 
|         |     87  | 
|         |     88     /** | 
|         |     89      * Crypto transforms ids | 
|         |     90      */ | 
|         |     91 #ifndef XMLSEC_NO_AES     | 
|         |     92     gXmlSecSymbianCryptoFunctions->transformAes128CbcGetKlass 	 | 
|         |     93                                            = xmlSecSymbianCryptoTransformAes128CbcGetKlass; | 
|         |     94     gXmlSecSymbianCryptoFunctions->transformAes192CbcGetKlass 	 | 
|         |     95                                            = xmlSecSymbianCryptoTransformAes192CbcGetKlass; | 
|         |     96     gXmlSecSymbianCryptoFunctions->transformAes256CbcGetKlass 	 | 
|         |     97                                            = xmlSecSymbianCryptoTransformAes256CbcGetKlass; | 
|         |     98 #endif /* XMLSEC_NO_AES */ | 
|         |     99  | 
|         |    100 #ifndef XMLSEC_NO_DES     | 
|         |    101     gXmlSecSymbianCryptoFunctions->transformDes3CbcGetKlass  | 
|         |    102                                             = xmlSecSymbianCryptoTransformDes3CbcGetKlass; | 
|         |    103 #endif /* XMLSEC_NO_DES */ | 
|         |    104  | 
|         |    105 #ifndef XMLSEC_NO_HMAC | 
|         |    106     gXmlSecSymbianCryptoFunctions->transformHmacSha1GetKlass 		 | 
|         |    107                                             = xmlSecSymbianCryptoTransformHmacSha1GetKlass; | 
|         |    108     gXmlSecSymbianCryptoFunctions->transformHmacRipemd160GetKlass 	 | 
|         |    109                                             = xmlSecSymbianCryptoTransformHmacRipemd160GetKlass; | 
|         |    110     gXmlSecSymbianCryptoFunctions->transformHmacMd5GetKlass 		 | 
|         |    111                                             = xmlSecSymbianCryptoTransformHmacMd5GetKlass; | 
|         |    112 #endif /* XMLSEC_NO_HMAC */ | 
|         |    113  | 
|         |    114 #ifndef XMLSEC_NO_SHA1     | 
|         |    115     gXmlSecSymbianCryptoFunctions->transformSha1GetKlass  | 
|         |    116                                             = xmlSecSymbianCryptoTransformSha1GetKlass; | 
|         |    117 #endif /* XMLSEC_NO_SHA1 */ | 
|         |    118  | 
|         |    119  | 
|         |    120 #ifndef XMLSEC_NO_RSA | 
|         |    121     gXmlSecSymbianCryptoFunctions->transformRsaSha1GetKlass 		 | 
|         |    122                                             = xmlSecSymbianCryptoTransformRsaSha1GetKlass; | 
|         |    123 #endif /* XMLSEC_NO_RSA */ | 
|         |    124  | 
|         |    125  | 
|         |    126  | 
|         |    127  | 
|         |    128     /** | 
|         |    129      * High level routines form xmlsec command line utility | 
|         |    130      */  | 
|         |    131     gXmlSecSymbianCryptoFunctions->cryptoAppInit 			 | 
|         |    132                                                 = xmlSecSymbianCryptoAppInit; | 
|         |    133     gXmlSecSymbianCryptoFunctions->cryptoAppShutdown 			 | 
|         |    134                                                 = xmlSecSymbianCryptoAppShutdown; | 
|         |    135     gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrInit 	 | 
|         |    136                                                 = xmlSecSymbianCryptoAppDefaultKeysMngrInit; | 
|         |    137     gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrAdoptKey 	 | 
|         |    138                                                 = xmlSecSymbianCryptoAppDefaultKeysMngrAdoptKey; | 
|         |    139     gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrLoad 	 | 
|         |    140                                                 = xmlSecSymbianCryptoAppDefaultKeysMngrLoad; | 
|         |    141     gXmlSecSymbianCryptoFunctions->cryptoAppDefaultKeysMngrSave 	 | 
|         |    142                                                 = xmlSecSymbianCryptoAppDefaultKeysMngrSave; | 
|         |    143 #ifndef XMLSEC_NO_X509 | 
|         |    144     gXmlSecSymbianCryptoFunctions->cryptoAppKeysMngrCertLoad 		 | 
|         |    145                                                 = xmlSecSymbianCryptoAppKeysMngrCertLoad; | 
|         |    146     gXmlSecSymbianCryptoFunctions->cryptoAppPkcs12Load  		 | 
|         |    147                                                 = xmlSecSymbianCryptoAppPkcs12Load;  | 
|         |    148     gXmlSecSymbianCryptoFunctions->cryptoAppKeyCertLoad 		 | 
|         |    149                                                 = xmlSecSymbianCryptoAppKeyCertLoad; | 
|         |    150 #endif /* XMLSEC_NO_X509 */ | 
|         |    151     gXmlSecSymbianCryptoFunctions->cryptoAppKeyLoadWithName		 | 
|         |    152                                                 = xmlSecSymbianCryptoAppKeyLoadWithName;      | 
|         |    153     gXmlSecSymbianCryptoFunctions->cryptoAppDefaultPwdCallback		 | 
|         |    154                                            = (void*)xmlSecSymbianCryptoAppGetDefaultPwdCallback(); | 
|         |    155  | 
|         |    156     return(gXmlSecSymbianCryptoFunctions); | 
|         |    157 } | 
|         |    158  | 
|         |    159  | 
|         |    160 /** | 
|         |    161  * xmlSecSymbianCryptoInit: | 
|         |    162  *  | 
|         |    163  * XMLSec library specific crypto engine initialization.  | 
|         |    164  * | 
|         |    165  * Returns 0 on success or a negative value otherwise. | 
|         |    166  */ | 
|         |    167 EXPORT_C | 
|         |    168 int  | 
|         |    169 xmlSecSymbianCryptoInit (void)  { | 
|         |    170     /* Check loaded xmlsec library version */ | 
|         |    171     if(xmlSecCheckVersionExact() != 1) { | 
|         |    172 	xmlSecError(XMLSEC_ERRORS_HERE, | 
|         |    173 		    NULL, | 
|         |    174 		    "xmlSecCheckVersionExact", | 
|         |    175 		    XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    176 		    XMLSEC_ERRORS_NO_MESSAGE); | 
|         |    177 	return(-1); | 
|         |    178     } | 
|         |    179  | 
|         |    180     if (sc_pkey_init() != 0) | 
|         |    181     { | 
|         |    182 	xmlSecError(XMLSEC_ERRORS_HERE, | 
|         |    183 		    NULL, | 
|         |    184 		    "sc_pkey_init", | 
|         |    185 		    XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    186 		    XMLSEC_ERRORS_NO_MESSAGE); | 
|         |    187 	return(-1); | 
|         |    188      | 
|         |    189     } | 
|         |    190  | 
|         |    191     /* register our klasses */ | 
|         |    192     if(xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms( | 
|         |    193                                                 xmlSecCryptoGetFunctions_symbiancrypto()) < 0) { | 
|         |    194 	xmlSecError(XMLSEC_ERRORS_HERE, | 
|         |    195 		    NULL, | 
|         |    196 		    "xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms", | 
|         |    197 		    XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    198 		    XMLSEC_ERRORS_NO_MESSAGE); | 
|         |    199 	return(-1); | 
|         |    200     } | 
|         |    201      | 
|         |    202     return(0); | 
|         |    203 } | 
|         |    204  | 
|         |    205 /** | 
|         |    206  * xmlSecSymbianCryptoShutdown: | 
|         |    207  *  | 
|         |    208  * XMLSec library specific crypto engine shutdown.  | 
|         |    209  * | 
|         |    210  * Returns 0 on success or a negative value otherwise. | 
|         |    211  */ | 
|         |    212 EXPORT_C | 
|         |    213 int  | 
|         |    214 xmlSecSymbianCryptoShutdown(void) { | 
|         |    215 	sc_pkey_shutdown(); | 
|         |    216     return(0); | 
|         |    217 } | 
|         |    218  | 
|         |    219 /** | 
|         |    220  * xmlSecSymbianCryptoKeysMngrInit: | 
|         |    221  * @mngr:		the pointer to keys manager. | 
|         |    222  * | 
|         |    223  * Adds SymbianCrypto specific key data stores in keys manager. | 
|         |    224  * | 
|         |    225  * Returns 0 on success or a negative value otherwise. | 
|         |    226  */ | 
|         |    227 EXPORT_C | 
|         |    228 int | 
|         |    229 xmlSecSymbianCryptoKeysMngrInit(xmlSecKeysMngrPtr mngr) { | 
|         |    230     int ret; | 
|         |    231      | 
|         |    232     xmlSecAssert2(mngr, -1); | 
|         |    233  | 
|         |    234     /* Implementation from OpenSSL */ | 
|         |    235 #ifndef XMLSEC_NO_X509 | 
|         |    236     /* create x509 store if needed */ | 
|         |    237     if(!xmlSecKeysMngrGetDataStore(mngr, xmlSecSymbianCryptoX509StoreId)) { | 
|         |    238 	xmlSecKeyDataStorePtr x509Store; | 
|         |    239  | 
|         |    240     x509Store = xmlSecKeyDataStoreCreate(xmlSecSymbianCryptoX509StoreId); | 
|         |    241 	if(!x509Store) { | 
|         |    242 	    xmlSecError(XMLSEC_ERRORS_HERE, | 
|         |    243 			NULL, | 
|         |    244 			"xmlSecKeyDataStoreCreate", | 
|         |    245 			XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    246 			"xmlSecOpenSSLX509StoreId"); | 
|         |    247 	    return(-1);    | 
|         |    248 	} | 
|         |    249      | 
|         |    250     ret = xmlSecKeysMngrAdoptDataStore(mngr, x509Store); | 
|         |    251     if(ret < 0) { | 
|         |    252 	    xmlSecError(XMLSEC_ERRORS_HERE, | 
|         |    253 			NULL, | 
|         |    254 			"xmlSecKeysMngrAdoptDataStore", | 
|         |    255 			XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    256 			XMLSEC_ERRORS_NO_MESSAGE); | 
|         |    257 	    xmlSecKeyDataStoreDestroy(x509Store); | 
|         |    258 	    return(-1);  | 
|         |    259 	} | 
|         |    260     } | 
|         |    261 #endif /* XMLSEC_NO_X509 */         | 
|         |    262     return(0); | 
|         |    263 } | 
|         |    264  | 
|         |    265 /** | 
|         |    266  * xmlSecSymbianCryptoGenerateRandom: | 
|         |    267  * @buffer:		the destination buffer. | 
|         |    268  * @size:		the numer of bytes to generate. | 
|         |    269  * | 
|         |    270  * Generates @size random bytes and puts result in @buffer. | 
|         |    271  * | 
|         |    272  * Returns 0 on success or a negative value otherwise. | 
|         |    273  */ | 
|         |    274 EXPORT_C | 
|         |    275 int | 
|         |    276 xmlSecSymbianCryptoGenerateRandom(xmlSecBufferPtr buffer, xmlSecSize size) {	 | 
|         |    277     int ret; | 
|         |    278      | 
|         |    279     xmlSecAssert2(buffer, -1); | 
|         |    280     xmlSecAssert2(size > 0, -1); | 
|         |    281  | 
|         |    282     ret = xmlSecBufferSetSize(buffer, size); | 
|         |    283     if(ret < 0) { | 
|         |    284 	xmlSecError(XMLSEC_ERRORS_HERE,  | 
|         |    285 		    NULL, | 
|         |    286 		    "xmlSecBufferSetSize", | 
|         |    287 		    XMLSEC_ERRORS_R_XMLSEC_FAILED, | 
|         |    288 		    "size=%d", size); | 
|         |    289 	return(-1); | 
|         |    290     } | 
|         |    291          | 
|         |    292     /* get random data */ | 
|         |    293     sc_randomize(xmlSecBufferGetData(buffer), size, SC_STRONG_RANDOM);  | 
|         |    294     /* | 
|         |    295     CSystemRandom* rand=CSystemRandom::NewLC(); | 
|         |    296     unsigned char* bytes=xmlSecBufferGetData(buffer); | 
|         |    297     TPtr8 ptr(bytes, xmlSecBufferGetMaxSize(buffer)); | 
|         |    298     rand->GenerateBytesL(ptr); | 
|         |    299     CleanupStack::PopAndDestroy(); | 
|         |    300     */ | 
|         |    301     return(0); | 
|         |    302 } |