2009-07-18 19:46 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbssl/Makefile
* contrib/hbssl/hbssl.h
* contrib/hbssl/hbssl.ch
* contrib/hbssl/sslctx.c
* contrib/hbssl/ssl.c
+ contrib/hbssl/sslbio.c
* contrib/hbssl/tests/test.prg
! Fixed a few bugs and typos, so now the test works.
+ Added very basic BIO interface.
This commit is contained in:
@@ -17,6 +17,17 @@
|
||||
past entries belonging to author(s): Viktor Szakats.
|
||||
*/
|
||||
|
||||
2009-07-18 19:46 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* contrib/hbssl/Makefile
|
||||
* contrib/hbssl/hbssl.h
|
||||
* contrib/hbssl/hbssl.ch
|
||||
* contrib/hbssl/sslctx.c
|
||||
* contrib/hbssl/ssl.c
|
||||
+ contrib/hbssl/sslbio.c
|
||||
* contrib/hbssl/tests/test.prg
|
||||
! Fixed a few bugs and typos, so now the test works.
|
||||
+ Added very basic BIO interface.
|
||||
|
||||
2009-07-18 14:35 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* contrib/hbssl/hbssl.hbc
|
||||
+ External libraries added for *nixes, OS/2 and adjusted
|
||||
|
||||
@@ -27,6 +27,7 @@ HB_USER_CFLAGS += $(foreach d, $(HB_INC_OPENSSL_OK), -I$(d))
|
||||
|
||||
C_SOURCES=\
|
||||
ssl.c \
|
||||
sslbio.c \
|
||||
sslciph.c \
|
||||
sslctx.c \
|
||||
sslrand.c \
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
|
||||
/* NOTE: This file is also used by C code. */
|
||||
|
||||
#define HB_SSL_CTX_NEW_METHOD_UNKNOWN ( -2 )
|
||||
#define HB_SSL_CTX_NEW_METHOD_DEFAULT ( -1 )
|
||||
#define HB_SSL_CTX_NEW_METHOD_SSLV2 0
|
||||
#define HB_SSL_CTX_NEW_METHOD_SSLV2_SERVER 1
|
||||
#define HB_SSL_CTX_NEW_METHOD_SSLV2_CLIENT 2
|
||||
@@ -74,4 +76,17 @@
|
||||
#define HB_SSLEAY_PLATFORM 3
|
||||
#define HB_SSLEAY_DIR 4
|
||||
|
||||
#define SSL_ERROR_NONE 0
|
||||
#define SSL_ERROR_SSL 1
|
||||
#define SSL_ERROR_WANT_READ 2
|
||||
#define SSL_ERROR_WANT_WRITE 3
|
||||
#define SSL_ERROR_WANT_X509_LOOKUP 4
|
||||
#define SSL_ERROR_SYSCALL 5
|
||||
#define SSL_ERROR_ZERO_RETURN 6
|
||||
#define SSL_ERROR_WANT_CONNECT 7
|
||||
#define SSL_ERROR_WANT_ACCEPT 8
|
||||
|
||||
#define BIO_NOCLOSE 0x00
|
||||
#define BIO_CLOSE 0x01
|
||||
|
||||
#endif /* HBSSL_CH_ */
|
||||
|
||||
@@ -59,6 +59,9 @@
|
||||
|
||||
extern SSL_METHOD * hb_ssl_method_id_to_ptr( int n );
|
||||
|
||||
extern void * hb_BIO_is( int iParam );
|
||||
extern BIO * hb_BIO_par( int iParam );
|
||||
|
||||
extern void * hb_SSL_CTX_is( int iParam );
|
||||
extern SSL_CTX * hb_SSL_CTX_par( int iParam );
|
||||
|
||||
|
||||
@@ -177,6 +177,22 @@ HB_FUNC( SSL_PENDING )
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( SSL_SET_BIO )
|
||||
{
|
||||
BIO * rbio = ( BIO * ) hb_parptr( 2 );
|
||||
BIO * wbio = ( BIO * ) hb_parptr( 2 );
|
||||
|
||||
if( hb_SSL_is( 1 ) && rbio && wbio )
|
||||
{
|
||||
SSL * ssl = hb_SSL_par( 1 );
|
||||
|
||||
if( ssl )
|
||||
SSL_set_bio( ssl, rbio, wbio );
|
||||
}
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( SSL_CONNECT )
|
||||
{
|
||||
if( hb_SSL_is( 1 ) )
|
||||
@@ -357,9 +373,9 @@ HB_FUNC( SSL_READ )
|
||||
PHB_ITEM pBuffer = hb_param( 2, HB_IT_STRING );
|
||||
int nRead;
|
||||
|
||||
if( pBuffer && HB_ISBYREF( 2 ) && HB_ISNUM( 3 ) )
|
||||
if( pBuffer && HB_ISBYREF( 2 ) )
|
||||
{
|
||||
nRead = hb_parni( 3 );
|
||||
nRead = HB_ISNUM( 3 ) ? hb_parni( 3 ) : ( int ) hb_parclen( 2 );
|
||||
|
||||
if( ( ULONG ) nRead <= hb_parcsiz( 2 ) )
|
||||
{
|
||||
@@ -445,7 +461,7 @@ HB_FUNC( SSL_WRITE )
|
||||
nLen = nWrite;
|
||||
}
|
||||
|
||||
hb_retni( SSL_read( ssl, ( void * ) hb_itemGetCPtr( pBuffer ), ( int ) nLen ) );
|
||||
hb_retni( SSL_write( ssl, hb_itemGetCPtr( pBuffer ), ( int ) nLen ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -488,7 +504,7 @@ HB_FUNC( SSL_GET_SSL_METHOD )
|
||||
else if( method == SSLv23_method() ) nMethod = HB_SSL_CTX_NEW_METHOD_SSLV23;
|
||||
else if( method == SSLv23_server_method() ) nMethod = HB_SSL_CTX_NEW_METHOD_SSLV23_SERVER;
|
||||
else if( method == SSLv23_client_method() ) nMethod = HB_SSL_CTX_NEW_METHOD_SSLV23_CLIENT;
|
||||
else nMethod = 0;
|
||||
else nMethod = HB_SSL_CTX_NEW_METHOD_UNKNOWN;
|
||||
|
||||
hb_retni( nMethod );
|
||||
}
|
||||
|
||||
100
harbour/contrib/hbssl/sslbio.c
Normal file
100
harbour/contrib/hbssl/sslbio.c
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* OpenSSL API (BIO) - Harbour interface.
|
||||
*
|
||||
* Copyright 2009 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
||||
*
|
||||
* As a special exception, the Harbour Project gives permission for
|
||||
* additional uses of the text contained in its release of Harbour.
|
||||
*
|
||||
* The exception is that, if you link the Harbour libraries with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the Harbour library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the Harbour
|
||||
* Project under the name Harbour. If you copy code from other
|
||||
* Harbour Project or Free Software Foundation releases into a copy of
|
||||
* Harbour, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for Harbour, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hbapi.h"
|
||||
#include "hbapierr.h"
|
||||
|
||||
#include "hbssl.h"
|
||||
|
||||
void * hb_BIO_is( int iParam )
|
||||
{
|
||||
return hb_parptr( iParam );
|
||||
}
|
||||
|
||||
BIO * hb_BIO_par( int iParam )
|
||||
{
|
||||
return ( BIO * ) hb_parptr( iParam );
|
||||
}
|
||||
|
||||
HB_FUNC( BIO_NEW_SOCKET )
|
||||
{
|
||||
if( HB_ISNUM( 1 ) )
|
||||
hb_retptr( BIO_new_socket( hb_parni( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : BIO_NOCLOSE ) );
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( BIO_NEW_DGRAM )
|
||||
{
|
||||
if( HB_ISNUM( 1 ) )
|
||||
hb_retptr( BIO_new_dgram( hb_parni( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : BIO_NOCLOSE ) );
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( BIO_NEW_FD )
|
||||
{
|
||||
if( HB_ISNUM( 1 ) )
|
||||
hb_retptr( BIO_new_fd( hb_parni( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : BIO_NOCLOSE ) );
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
HB_FUNC( BIO_FREE )
|
||||
{
|
||||
BIO * bio = hb_BIO_par( 1 );
|
||||
|
||||
if( bio )
|
||||
hb_retni( BIO_free( bio ) );
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
@@ -57,8 +57,8 @@
|
||||
|
||||
HB_FUNC( SSL_INIT )
|
||||
{
|
||||
SSL_load_error_strings();
|
||||
SSL_library_init();
|
||||
SSL_load_error_strings();
|
||||
}
|
||||
|
||||
HB_FUNC( SSLEAY_VERSION )
|
||||
@@ -132,7 +132,7 @@ HB_FUNC( SSL_CTX_NEW )
|
||||
{
|
||||
void ** ph = ( void ** ) hb_gcAlloc( sizeof( SSL_CTX * ), SSL_CTX_release );
|
||||
|
||||
SSL_CTX * ctx = SSL_CTX_new( hb_ssl_method_id_to_ptr( hb_parni( 1 ) ) );
|
||||
SSL_CTX * ctx = SSL_CTX_new( hb_ssl_method_id_to_ptr( HB_ISNUM( 1 ) ? hb_parni( 1 ) : HB_SSL_CTX_NEW_METHOD_DEFAULT ) );
|
||||
|
||||
* ph = ( void * ) ctx;
|
||||
|
||||
|
||||
@@ -7,24 +7,46 @@
|
||||
* www - http://www.harbour-project.org
|
||||
*/
|
||||
|
||||
#include "simpleio.ch"
|
||||
|
||||
#include "hbssl.ch"
|
||||
|
||||
PROCEDURE Main()
|
||||
LOCAL ssl_ctx
|
||||
LOCAL ssl
|
||||
LOCAL bio
|
||||
LOCAL cipher
|
||||
|
||||
LOCAL socket
|
||||
LOCAL buffer := Space( 1000 )
|
||||
LOCAL buffer
|
||||
|
||||
LOCAL bits
|
||||
LOCAL tmp
|
||||
|
||||
//
|
||||
|
||||
hb_inetInit()
|
||||
|
||||
? "-------"
|
||||
|
||||
socket := hb_inetCreate()
|
||||
? "INETTIMEOUT", hb_inetTimeout( socket, 500 )
|
||||
? "INETCONN", hb_inetConnect( "www.fortify.net", 80, socket )
|
||||
? "INETERR", hb_inetErrorCode( socket )
|
||||
? "INETFD", hb_inetFD( socket )
|
||||
? "INETSEND", hb_inetSend( socket, "GET / http/1.1" + hb_inetCRLF() + "Host: " + "www.syenar.hu" + hb_inetCRLF() + hb_inetCRLF() )
|
||||
? "INETERR", hb_inetErrorCode( socket )
|
||||
buffer := Space( 1024 )
|
||||
? "INETRECVALL", hb_inetRecvAll( socket, @buffer, Len( buffer ) )
|
||||
? "BUFFER", ">" + AllTrim( buffer ) + "<"
|
||||
? "INETCLOSE", hb_inetClose( socket )
|
||||
|
||||
? "-------"
|
||||
|
||||
socket := hb_inetCreate()
|
||||
? hb_inetTimeout( socket, 500 )
|
||||
? hb_inetConnect( "www.fortify.net", 443, socket )
|
||||
? hb_inetErrorCode( socket )
|
||||
|
||||
//
|
||||
|
||||
@@ -46,8 +68,11 @@ PROCEDURE Main()
|
||||
? "SSL_VERSION", SSL_VERSION( ssl )
|
||||
? "SSL_GET_VERSION", SSL_GET_VERSION( ssl )
|
||||
|
||||
? "INET FD", hb_inetFD( socket )
|
||||
|
||||
? "SSL_SET_FD", SSL_SET_FD( ssl, hb_inetFD( socket ) )
|
||||
? "SSL_CONNECT", SSL_CONNECT( ssl )
|
||||
? "SSL_CONNECT", tmp := SSL_CONNECT( ssl )
|
||||
? "SSL_GET_ERROR", SSL_GET_ERROR( ssl, tmp )
|
||||
|
||||
? "SSL_GET_CIPHER_BITS" , SSL_GET_CIPHER_BITS( ssl, @bits ), bits
|
||||
? "SSL_GET_CIPHER_LIST" , SSL_GET_CIPHER_LIST( ssl )
|
||||
@@ -58,11 +83,13 @@ PROCEDURE Main()
|
||||
? "SSL_CIPHER_GET_NAME" , SSL_CIPHER_GET_NAME( cipher )
|
||||
? "SSL_CIPHER_GET_VERSION", SSL_CIPHER_GET_VERSION( cipher )
|
||||
? "SSL_CIPHER_GET_BITS" , SSL_CIPHER_GET_BITS( cipher, @bits ), bits
|
||||
? "SSL_CIPHER_DESCRIPTION", SSL_CIPHER_DESCRIPTION( cipher )
|
||||
|
||||
? "SSL_WRITE", SSL_WRITE( ssl, "GET / http/1.1" )
|
||||
? "SSL_READ", SSL_READ( ssl, @buffer )
|
||||
// ? "SSL_CIPHER_DESCRIPTION", SSL_CIPHER_DESCRIPTION( cipher )
|
||||
|
||||
? "SSL_WRITE", tmp := SSL_WRITE( ssl, "GET / http/1.1" + hb_inetCRLF() + "Host: " + "www.fortify.net" + hb_inetCRLF() + hb_inetCRLF() )
|
||||
? "SSL_GET_ERROR", SSL_GET_ERROR( ssl, tmp )
|
||||
buffer := Space( 1024 )
|
||||
? "SSL_READ", tmp := SSL_READ( ssl, @buffer )
|
||||
? "SSL_GET_ERROR", SSL_GET_ERROR( ssl, tmp )
|
||||
? buffer
|
||||
|
||||
? hb_inetClose( socket )
|
||||
|
||||
Reference in New Issue
Block a user