sl@0: /* sl@0: Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. sl@0: sl@0: Redistribution and use in source and binary forms, with or without sl@0: modification, are permitted provided that the following conditions are met: sl@0: sl@0: * Redistributions of source code must retain the above copyright notice, this sl@0: list of conditions and the following disclaimer. sl@0: * Redistributions in binary form must reproduce the above copyright notice, sl@0: this list of conditions and the following disclaimer in the documentation sl@0: and/or other materials provided with the distribution. sl@0: * Neither the name of Nokia Corporation nor the names of its contributors sl@0: may be used to endorse or promote products derived from this software sl@0: without specific prior written permission. sl@0: sl@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" sl@0: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE sl@0: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE sl@0: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE sl@0: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL sl@0: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR sl@0: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER sl@0: CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, sl@0: OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE sl@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sl@0: sl@0: Description: sl@0: */ sl@0: sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: sl@0: #include "libssl_wsd.h" sl@0: /* sl@0: #include "wsd_solution.h" sl@0: */ sl@0: sl@0: #ifdef __WINSCW__ sl@0: #include //GetProcAddress, GetModuleHandle sl@0: #include "pls.h" // For emulator WSD API sl@0: const TUid KLibdlUid3 = {0x10281F34}; // This is the UID of the library sl@0: #endif//defined(__WINSCW__) || defined(__WINS__) sl@0: sl@0: #ifdef __cplusplus sl@0: extern "C" sl@0: { sl@0: #endif sl@0: sl@0: #ifdef EMULATOR sl@0: sl@0: sl@0: extern const SSL_METHOD temp_methods_sslp; sl@0: extern const SSL_METHOD temp_DTLSv1_method_data; sl@0: extern const SSL_METHOD temp_DTLSv1_client_method_data; sl@0: extern const SSL_METHOD temp_dtlsv1_base_method_data; sl@0: extern const SSL_METHOD temp_DTLSv1_server_method_data; sl@0: extern const SSL_METHOD temp_SSLv23_client_method_data; sl@0: extern const SSL_METHOD temp_sslv23_base_method_data; sl@0: extern const SSL_METHOD temp_SSLv23_method_data; sl@0: extern const SSL_METHOD temp_SSLv23_server_method_data; sl@0: extern const SSL_METHOD temp_SSLv2_client_method_data; sl@0: extern const SSL_METHOD temp_sslv2_base_method_data; sl@0: extern const SSL_METHOD temp_SSLv2_method_data; sl@0: extern const SSL_METHOD temp_SSLv2_server_method_data; sl@0: extern const SSL_METHOD temp_SSLv3_client_method_data; sl@0: extern const SSL_METHOD temp_sslv3_base_method_data; sl@0: extern const SSL_METHOD temp_SSLv3_method_data; sl@0: extern const SSL_METHOD temp_SSLv3_server_method_data; sl@0: extern const SSL_METHOD temp_TLSv1_client_method_data; sl@0: extern const SSL_METHOD temp_tlsv1_base_method_data; sl@0: extern const SSL_METHOD temp_TLSv1_server_method_data; sl@0: extern const SSL_METHOD temp_TLSv1_method_data; sl@0: extern const ERR_STRING_DATA temp_SSL_str_functs[172]; sl@0: extern const ERR_STRING_DATA temp_SSL_str_reasons[238]; sl@0: extern const SSL_CIPHER temp_ssl3_ciphers[87]; sl@0: extern const SSL_CIPHER temp_ssl2_ciphers[10]; sl@0: extern const SSL3_ENC_METHOD temp_ssl3_undef_enc_method; sl@0: extern const SSL3_ENC_METHOD temp_DTLSv1_enc_data; sl@0: extern const SSL3_ENC_METHOD temp_SSLv3_enc_data; sl@0: extern const SSL3_ENC_METHOD temp_TLSv1_enc_data; sl@0: sl@0: int LibSSLWSD_Init(_libssl_wsd *p); sl@0: sl@0: _libssl_wsd *Libssl_ImpurePtr() sl@0: { sl@0: /* // Access the PLS area of this process. sl@0: struct _libssl_wsd *p = (struct _libssl_wsd*)Pls(); sl@0: sl@0: if(p) sl@0: return p; sl@0: sl@0: // To allocate storage for the global object within the sl@0: // VAS of the emulator. sl@0: p = (struct _libssl_wsd *)AllocatePls(sizeof(struct _libssl_wsd)); sl@0: sl@0: if(!p) sl@0: User::Panic(_L("LIBSSL-INIT"),KErrNoMemory); sl@0: sl@0: // Placement new to construct the WSD object at 'p' sl@0: new (p) struct _libssl_wsd; sl@0: sl@0: // WSD object initialization sl@0: Mem::FillZ(p,sizeof(struct _libssl_wsd)); sl@0: InitSSLWsdVar(p); sl@0: sl@0: // Set the Pls with the new value sl@0: TInt err = SetPls(p); sl@0: sl@0: if(err != KErrNone) sl@0: { sl@0: User::Panic(_L("LIBSSL-INIT"),err); sl@0: } sl@0: */ sl@0: _libssl_wsd *p = Pls<_libssl_wsd>(KLibdlUid3, LibSSLWSD_Init); sl@0: return p; sl@0: } sl@0: sl@0: int LibSSLWSD_Init(_libssl_wsd *p) sl@0: { sl@0: if(p) sl@0: { sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(methods_sslp,bio_ssl,s)),&temp_methods_sslp,sizeof(SSL_METHOD)); sl@0: sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)),&temp_ssl3_undef_enc_method,sizeof(SSL3_ENC_METHOD)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(DTLSv1_enc_data,d1_lib,g)),&temp_DTLSv1_enc_data,sizeof(SSL3_ENC_METHOD)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(TLSv1_enc_data,t1_lib,g)),&temp_TLSv1_enc_data,sizeof(SSL3_ENC_METHOD)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv3_enc_data,s3_lib,g)),&temp_SSLv3_enc_data,sizeof(SSL3_ENC_METHOD)); sl@0: sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(DTLSv1_method_data,d1_meth,s)),&temp_DTLSv1_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(DTLSv1_method_data,d1_meth,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(DTLSv1_enc_data,d1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(DTLSv1_client_method_data,d1_clnt,s)),&temp_DTLSv1_client_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(DTLSv1_client_method_data,d1_clnt,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(DTLSv1_enc_data,d1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(dtlsv1_base_method_data,d1_lib,s)),&temp_dtlsv1_base_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(dtlsv1_base_method_data,d1_lib,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(DTLSv1_enc_data,d1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(DTLSv1_server_method_data,d1_srvr,s)),&temp_DTLSv1_server_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(DTLSv1_server_method_data,d1_srvr,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(DTLSv1_enc_data,d1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv23_client_method_data,s23_clnt,s)),&temp_SSLv23_client_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv23_client_method_data,s23_clnt,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(sslv23_base_method_data,s23_lib,s)),&temp_sslv23_base_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(sslv23_base_method_data,s23_lib,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv23_method_data,s23_meth,s)),&temp_SSLv23_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv23_method_data,s23_meth,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv23_server_method_data,s23_srvr,s)),&temp_SSLv23_server_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv23_server_method_data,s23_srvr,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv2_client_method_data,s2_clnt,s)),&temp_SSLv2_client_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv2_client_method_data,s2_clnt,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(sslv2_base_method_data,s2_lib,s)),&temp_sslv2_base_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(sslv2_base_method_data,s2_lib,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv2_method_data,s2_meth,s)),&temp_SSLv2_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv2_method_data,s2_meth,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv2_server_method_data,s2_srvr,s)),&temp_SSLv2_server_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv2_server_method_data,s2_srvr,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(ssl3_undef_enc_method,ssl_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv3_client_method_data,s3_clnt,s)),&temp_SSLv3_client_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv3_client_method_data,s3_clnt,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(SSLv3_enc_data,s3_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(sslv3_base_method_data,s3_lib,s)),&temp_sslv3_base_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(sslv3_base_method_data,s3_lib,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(SSLv3_enc_data,s3_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv3_method_data,s3_meth,s)),&temp_SSLv3_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv3_method_data,s3_meth,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(SSLv3_enc_data,s3_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSLv3_server_method_data,s3_srvr,s)),&temp_SSLv3_server_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(SSLv3_server_method_data,s3_srvr,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(SSLv3_enc_data,s3_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(TLSv1_client_method_data,t1_clnt,s)),&temp_TLSv1_client_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(TLSv1_client_method_data,t1_clnt,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(TLSv1_enc_data,t1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(tlsv1_base_method_data,t1_lib,s)),&temp_tlsv1_base_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(tlsv1_base_method_data,t1_lib,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(TLSv1_enc_data,t1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(TLSv1_server_method_data,t1_srvr,s)),&temp_TLSv1_server_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(TLSv1_server_method_data,t1_srvr,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(TLSv1_enc_data,t1_lib,g)); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(TLSv1_method_data,t1_meth,s)),&temp_TLSv1_method_data,sizeof(SSL_METHOD)); sl@0: (p->GET_WSD_VAR_NAME(TLSv1_method_data,t1_meth,s)).ssl3_enc = &(p->GET_WSD_VAR_NAME(TLSv1_enc_data,t1_lib,g)); sl@0: sl@0: p->GET_WSD_VAR_NAME(ssl_x509_store_ctx_idx,ssl_cert,s) = -1; sl@0: sl@0: p->GET_WSD_VAR_NAME(ssl_comp_methods,ssl_ciph,s) = NULL; sl@0: sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSL_str_functs,ssl_err,s)),&temp_SSL_str_functs,sizeof(ERR_STRING_DATA) * SSL_STR_FUNCTS_NUM); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(SSL_str_reasons,ssl_err,s)),&temp_SSL_str_reasons,sizeof(ERR_STRING_DATA) * SSL_STR_REASONS_NUM); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(ssl3_ciphers,s3_lib,g)),&temp_ssl3_ciphers,sizeof(SSL_CIPHER) * SSL3_NUM_CIPHERS); sl@0: sl@0: memcpy(&(p->GET_WSD_VAR_NAME(ssl2_ciphers,s2_lib,g)),&temp_ssl2_ciphers,sizeof(SSL_CIPHER) * SSL2_NUM_CIPHERS); sl@0: sl@0: sl@0: sl@0: } sl@0: return KErrNone; sl@0: } sl@0: #endif /*EMULATOR*/ sl@0: sl@0: #ifdef __cplusplus sl@0: } sl@0: #endif sl@0: