00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "tlsopensslserver.h"
00016
00017 #ifdef HAVE_OPENSSL
00018
00019 #ifndef __SYMBIAN32__
00020
00021 #ifndef HEADER_DH_H
00022 #include <openssl/dh.h>
00023 #endif
00024
00025 namespace gloox
00026 {
00027
00028 OpenSSLServer::OpenSSLServer( TLSHandler* th )
00029 : OpenSSLBase( th )
00030 {
00031 }
00032
00033 OpenSSLServer::~OpenSSLServer()
00034 {
00035 }
00036
00037 bool OpenSSLServer::setType()
00038 {
00039 m_ctx = SSL_CTX_new( SSLv23_server_method() );
00040 if( !m_ctx )
00041 return false;
00042
00043 return true;
00044 }
00045
00046 int OpenSSLServer::handshakeFunction()
00047 {
00048 return SSL_accept( m_ssl );
00049 }
00050
00051 DH* getDH512()
00052 {
00053 static unsigned char dh512_p[] =
00054 {
00055 0xF5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C,
00056 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29,
00057 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B,
00058 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C,
00059 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55,
00060 0xE9,0x2A,0x05,0x5F,
00061 };
00062 static unsigned char dh512_g[] =
00063 {
00064 0x02,
00065 };
00066 DH* dh = DH_new();
00067
00068 if( !dh )
00069 return 0;
00070
00071 dh->p = BN_bin2bn( dh512_p, sizeof( dh512_p ), 0 );
00072 dh->g = BN_bin2bn( dh512_g, sizeof( dh512_g ), 0 );
00073 if( ( dh->p == 0 ) || ( dh->g == 0 ) )
00074 {
00075 DH_free( dh );
00076 return 0;
00077 }
00078
00079 return dh;
00080 }
00081 DH* getDH1024()
00082 {
00083 static unsigned char dh1024_p[]={
00084 0xF4,0x88,0xFD,0x58,0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,
00085 0x91,0x07,0x36,0x6B,0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,
00086 0x88,0xB3,0x1C,0x7C,0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,
00087 0x43,0xF0,0xA5,0x5B,0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,
00088 0x38,0xD3,0x34,0xFD,0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,
00089 0xDE,0x33,0x21,0x2C,0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,
00090 0x18,0x11,0x8D,0x7C,0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,
00091 0x19,0xC8,0x07,0x29,0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,
00092 0xD0,0x0A,0x50,0x9B,0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,
00093 0x41,0x9F,0x9C,0x7C,0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,
00094 0xA2,0x5E,0xC3,0x55,0xE9,0x2F,0x78,0xC7,
00095 };
00096 static unsigned char dh1024_g[]={
00097 0x02,
00098 };
00099 DH* dh = DH_new();
00100
00101 if( !dh )
00102 return 0;
00103
00104 dh->p = BN_bin2bn( dh1024_p, sizeof( dh1024_p ), 0 );
00105 dh->g = BN_bin2bn( dh1024_g, sizeof( dh1024_g ), 0 );
00106 if( ( dh->p == 0 ) || ( dh->g == 0 ) )
00107 {
00108 DH_free( dh );
00109 return 0;
00110 }
00111
00112 return dh;
00113 }
00114 DH* getDH2048()
00115 {
00116 static unsigned char dh2048_p[]={
00117 0xF6,0x42,0x57,0xB7,0x08,0x7F,0x08,0x17,0x72,0xA2,0xBA,0xD6,
00118 0xA9,0x42,0xF3,0x05,0xE8,0xF9,0x53,0x11,0x39,0x4F,0xB6,0xF1,
00119 0x6E,0xB9,0x4B,0x38,0x20,0xDA,0x01,0xA7,0x56,0xA3,0x14,0xE9,
00120 0x8F,0x40,0x55,0xF3,0xD0,0x07,0xC6,0xCB,0x43,0xA9,0x94,0xAD,
00121 0xF7,0x4C,0x64,0x86,0x49,0xF8,0x0C,0x83,0xBD,0x65,0xE9,0x17,
00122 0xD4,0xA1,0xD3,0x50,0xF8,0xF5,0x59,0x5F,0xDC,0x76,0x52,0x4F,
00123 0x3D,0x3D,0x8D,0xDB,0xCE,0x99,0xE1,0x57,0x92,0x59,0xCD,0xFD,
00124 0xB8,0xAE,0x74,0x4F,0xC5,0xFC,0x76,0xBC,0x83,0xC5,0x47,0x30,
00125 0x61,0xCE,0x7C,0xC9,0x66,0xFF,0x15,0xF9,0xBB,0xFD,0x91,0x5E,
00126 0xC7,0x01,0xAA,0xD3,0x5B,0x9E,0x8D,0xA0,0xA5,0x72,0x3A,0xD4,
00127 0x1A,0xF0,0xBF,0x46,0x00,0x58,0x2B,0xE5,0xF4,0x88,0xFD,0x58,
00128 0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,0x91,0x07,0x36,0x6B,
00129 0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,0x88,0xB3,0x1C,0x7C,
00130 0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,0x43,0xF0,0xA5,0x5B,
00131 0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,0x38,0xD3,0x34,0xFD,
00132 0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,0xDE,0x33,0x21,0x2C,
00133 0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C,
00134 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29,
00135 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B,
00136 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C,
00137 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55,
00138 0xE9,0x32,0x0B,0x3B,
00139 };
00140 static unsigned char dh2048_g[]={
00141 0x02,
00142 };
00143 DH* dh = DH_new();
00144
00145 if( !dh )
00146 return 0;
00147
00148 dh->p = BN_bin2bn( dh2048_p, sizeof( dh2048_p ), 0 );
00149 dh->g = BN_bin2bn( dh2048_g, sizeof( dh2048_g ), 0 );
00150 if( ( dh->p == 0 ) || ( dh->g == 0 ) )
00151 {
00152 DH_free( dh );
00153 return 0;
00154 }
00155
00156 return dh;
00157 }
00158
00159 DH* getDH4096()
00160 {
00161 static unsigned char dh4096_p[]={
00162 0xFA,0x14,0x72,0x52,0xC1,0x4D,0xE1,0x5A,0x49,0xD4,0xEF,0x09,
00163 0x2D,0xC0,0xA8,0xFD,0x55,0xAB,0xD7,0xD9,0x37,0x04,0x28,0x09,
00164 0xE2,0xE9,0x3E,0x77,0xE2,0xA1,0x7A,0x18,0xDD,0x46,0xA3,0x43,
00165 0x37,0x23,0x90,0x97,0xF3,0x0E,0xC9,0x03,0x50,0x7D,0x65,0xCF,
00166 0x78,0x62,0xA6,0x3A,0x62,0x22,0x83,0xA1,0x2F,0xFE,0x79,0xBA,
00167 0x35,0xFF,0x59,0xD8,0x1D,0x61,0xDD,0x1E,0x21,0x13,0x17,0xFE,
00168 0xCD,0x38,0x87,0x9E,0xF5,0x4F,0x79,0x10,0x61,0x8D,0xD4,0x22,
00169 0xF3,0x5A,0xED,0x5D,0xEA,0x21,0xE9,0x33,0x6B,0x48,0x12,0x0A,
00170 0x20,0x77,0xD4,0x25,0x60,0x61,0xDE,0xF6,0xB4,0x4F,0x1C,0x63,
00171 0x40,0x8B,0x3A,0x21,0x93,0x8B,0x79,0x53,0x51,0x2C,0xCA,0xB3,
00172 0x7B,0x29,0x56,0xA8,0xC7,0xF8,0xF4,0x7B,0x08,0x5E,0xA6,0xDC,
00173 0xA2,0x45,0x12,0x56,0xDD,0x41,0x92,0xF2,0xDD,0x5B,0x8F,0x23,
00174 0xF0,0xF3,0xEF,0xE4,0x3B,0x0A,0x44,0xDD,0xED,0x96,0x84,0xF1,
00175 0xA8,0x32,0x46,0xA3,0xDB,0x4A,0xBE,0x3D,0x45,0xBA,0x4E,0xF8,
00176 0x03,0xE5,0xDD,0x6B,0x59,0x0D,0x84,0x1E,0xCA,0x16,0x5A,0x8C,
00177 0xC8,0xDF,0x7C,0x54,0x44,0xC4,0x27,0xA7,0x3B,0x2A,0x97,0xCE,
00178 0xA3,0x7D,0x26,0x9C,0xAD,0xF4,0xC2,0xAC,0x37,0x4B,0xC3,0xAD,
00179 0x68,0x84,0x7F,0x99,0xA6,0x17,0xEF,0x6B,0x46,0x3A,0x7A,0x36,
00180 0x7A,0x11,0x43,0x92,0xAD,0xE9,0x9C,0xFB,0x44,0x6C,0x3D,0x82,
00181 0x49,0xCC,0x5C,0x6A,0x52,0x42,0xF8,0x42,0xFB,0x44,0xF9,0x39,
00182 0x73,0xFB,0x60,0x79,0x3B,0xC2,0x9E,0x0B,0xDC,0xD4,0xA6,0x67,
00183 0xF7,0x66,0x3F,0xFC,0x42,0x3B,0x1B,0xDB,0x4F,0x66,0xDC,0xA5,
00184 0x8F,0x66,0xF9,0xEA,0xC1,0xED,0x31,0xFB,0x48,0xA1,0x82,0x7D,
00185 0xF8,0xE0,0xCC,0xB1,0xC7,0x03,0xE4,0xF8,0xB3,0xFE,0xB7,0xA3,
00186 0x13,0x73,0xA6,0x7B,0xC1,0x0E,0x39,0xC7,0x94,0x48,0x26,0x00,
00187 0x85,0x79,0xFC,0x6F,0x7A,0xAF,0xC5,0x52,0x35,0x75,0xD7,0x75,
00188 0xA4,0x40,0xFA,0x14,0x74,0x61,0x16,0xF2,0xEB,0x67,0x11,0x6F,
00189 0x04,0x43,0x3D,0x11,0x14,0x4C,0xA7,0x94,0x2A,0x39,0xA1,0xC9,
00190 0x90,0xCF,0x83,0xC6,0xFF,0x02,0x8F,0xA3,0x2A,0xAC,0x26,0xDF,
00191 0x0B,0x8B,0xBE,0x64,0x4A,0xF1,0xA1,0xDC,0xEE,0xBA,0xC8,0x03,
00192 0x82,0xF6,0x62,0x2C,0x5D,0xB6,0xBB,0x13,0x19,0x6E,0x86,0xC5,
00193 0x5B,0x2B,0x5E,0x3A,0xF3,0xB3,0x28,0x6B,0x70,0x71,0x3A,0x8E,
00194 0xFF,0x5C,0x15,0xE6,0x02,0xA4,0xCE,0xED,0x59,0x56,0xCC,0x15,
00195 0x51,0x07,0x79,0x1A,0x0F,0x25,0x26,0x27,0x30,0xA9,0x15,0xB2,
00196 0xC8,0xD4,0x5C,0xCC,0x30,0xE8,0x1B,0xD8,0xD5,0x0F,0x19,0xA8,
00197 0x80,0xA4,0xC7,0x01,0xAA,0x8B,0xBA,0x53,0xBB,0x47,0xC2,0x1F,
00198 0x6B,0x54,0xB0,0x17,0x60,0xED,0x79,0x21,0x95,0xB6,0x05,0x84,
00199 0x37,0xC8,0x03,0xA4,0xDD,0xD1,0x06,0x69,0x8F,0x4C,0x39,0xE0,
00200 0xC8,0x5D,0x83,0x1D,0xBE,0x6A,0x9A,0x99,0xF3,0x9F,0x0B,0x45,
00201 0x29,0xD4,0xCB,0x29,0x66,0xEE,0x1E,0x7E,0x3D,0xD7,0x13,0x4E,
00202 0xDB,0x90,0x90,0x58,0xCB,0x5E,0x9B,0xCD,0x2E,0x2B,0x0F,0xA9,
00203 0x4E,0x78,0xAC,0x05,0x11,0x7F,0xE3,0x9E,0x27,0xD4,0x99,0xE1,
00204 0xB9,0xBD,0x78,0xE1,0x84,0x41,0xA0,0xDF,
00205 };
00206 static unsigned char dh4096_g[]={
00207 0x02,
00208 };
00209 DH* dh = DH_new();
00210
00211 if( !dh )
00212 return 0;
00213
00214 dh->p = BN_bin2bn( dh4096_p, sizeof( dh4096_p ), 0 );
00215 dh->g = BN_bin2bn( dh4096_g, sizeof( dh4096_g ), 0 );
00216 if( ( dh->p == 0 ) || ( dh->g == 0 ) )
00217 {
00218 DH_free( dh );
00219 return 0;
00220 }
00221
00222 return dh;
00223 }
00224
00225 DH* tmp_dh_callback( SSL* , int is_export, int keylength )
00226 {
00227 switch( keylength )
00228 {
00229 case 512:
00230 return getDH512();
00231 break;
00232 case 1024:
00233 return getDH1024();
00234 break;
00235 case 2048:
00236 return getDH2048();
00237 break;
00238 case 4096:
00239 return getDH4096();
00240 break;
00241 default:
00242
00243 return 0;
00244 break;
00245 }
00246 }
00247
00248 RSA* tmp_rsa_callback( SSL* , int is_export, int keylength )
00249 {
00250 return RSA_generate_key( keylength, RSA_F4, 0, 0 );
00251 }
00252
00253 bool OpenSSLServer::privateInit()
00254 {
00255 SSL_CTX_set_tmp_rsa_callback( m_ctx, tmp_rsa_callback );
00256 SSL_CTX_set_tmp_dh_callback( m_ctx, tmp_dh_callback );
00257 SSL_CTX_set_tmp_ecdh( m_ctx, EC_KEY_new_by_curve_name( NID_sect163r2 ) );
00258 SSL_CTX_set_options( m_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE );
00259 return true;
00260 }
00261
00262 }
00263
00264 #endif // __SYMBIAN32__
00265
00266 #endif // HAVE_OPENSSL