2009-07-23 01:06 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)

+ contrib/hbssl/tests/pem.prg
  + contrib/hbssl/tests/privkey.pem
  * contrib/hbssl/pem.c
    + Added these public/private key loading functions:
      PEM_READ_BIO_PRIVATEKEY()
      PEM_READ_BIO_PUBKEY()
      PEM_READ_BIO_RSAPRIVATEKEY()
      PEM_READ_BIO_RSAPUBLICKEY()
      PEM_READ_BIO_RSA_PUBKEY()
      PEM_READ_BIO_DSAPRIVATEKEY()
      PEM_READ_BIO_DSA_PUBKEY()
      PEM_READ_BIO_DSAPARAMS()
      PEM_READ_BIO_DHPARAMS()
      PEM_READ_BIO_X509()
      PEM_READ_BIO_X509_AUX()
      PEM_READ_BIO_X509_REQ()
      PEM_READ_BIO_X509_CRL()
      PEM_READ_BIO_PKCS7()
      Usage:
         PEM_READ_BIO_*( <ptrBIO> | <cFileName> | <fhnd>, <bPasswordCB> | <cPassword> ) -> ptr | NULL
         To load from memory, BIO_new_mem_buf() can be used, see in test.
         <bPasswordCB> is a codeblock which receive a logical parameter indicating 
         write/read mode (.T. = write) a returns password as string or else (like NIL) for failure.
This commit is contained in:
Viktor Szakats
2009-07-22 23:10:18 +00:00
parent 2f3f3252de
commit 8aa43735fc
4 changed files with 147 additions and 78 deletions

View File

@@ -17,6 +17,31 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-07-23 01:06 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
+ contrib/hbssl/tests/pem.prg
+ contrib/hbssl/tests/privkey.pem
* contrib/hbssl/pem.c
+ Added these public/private key loading functions:
PEM_READ_BIO_PRIVATEKEY()
PEM_READ_BIO_PUBKEY()
PEM_READ_BIO_RSAPRIVATEKEY()
PEM_READ_BIO_RSAPUBLICKEY()
PEM_READ_BIO_RSA_PUBKEY()
PEM_READ_BIO_DSAPRIVATEKEY()
PEM_READ_BIO_DSA_PUBKEY()
PEM_READ_BIO_DSAPARAMS()
PEM_READ_BIO_DHPARAMS()
PEM_READ_BIO_X509()
PEM_READ_BIO_X509_AUX()
PEM_READ_BIO_X509_REQ()
PEM_READ_BIO_X509_CRL()
PEM_READ_BIO_PKCS7()
Usage:
PEM_READ_BIO_*( <ptrBIO> | <cFileName> | <fhnd>, <bPasswordCB> | <cPassword> ) -> ptr | NULL
To load from memory, BIO_new_mem_buf() can be used, see in test.
<bPasswordCB> is a codeblock which receive a logical parameter indicating
write/read mode (.T. = write) a returns password as string or else (like NIL) for failure.
2009-07-22 22:10 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* config/global.cf
! Fixed GTSLN exclusion if HB_COMMERCE is set.

View File

@@ -58,7 +58,7 @@
#include "hbssl.h"
/* ---------------------------------------------------------------------------- */
/* Callbacks */
/* Callback */
static int hb_ssl_pem_password_cb( char * buf, int size, int rwflag, void * userdata )
{
@@ -66,19 +66,22 @@ static int hb_ssl_pem_password_cb( char * buf, int size, int rwflag, void * user
if( size > 0 && userdata )
{
PHB_ITEM p = hb_itemPutNI( NULL, rwflag );
PHB_ITEM p = hb_itemPutL( NULL, rwflag );
PHB_ITEM r = hb_vmEvalBlockV( ( PHB_ITEM ) userdata, 1, p );
hb_itemRelease( p );
buf[ 0 ] = '\0';
retsize = hb_itemGetCLen( r );
if( retsize > size )
retsize = size;
if( retsize > 0 )
{
if( retsize > size )
retsize = size;
memcpy( buf, hb_itemGetCPtr( r ), retsize );
hb_itemRelease( p );
memcpy( buf, hb_itemGetCPtr( r ), retsize );
}
}
return retsize;
@@ -89,12 +92,15 @@ HB_FUNC( ERR_LOAD_PEM_STRINGS )
ERR_load_PEM_strings();
}
HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY )
typedef void * PEM_READ_BIO( BIO * bp, void ** x, pem_password_cb * cb, void * u );
typedef void * PEM_WRITE_BIO( BIO * bp, void ** x, pem_password_cb * cb, void * u );
static void hb_PEM_read_bio( PEM_READ_BIO * func )
{
BIO * bio;
if( HB_ISPOINTER( 1 ) )
bio = hb_parptr( 1 );
bio = ( BIO * ) hb_parptr( 1 );
else if( HB_ISCHAR( 1 ) )
bio = BIO_new_file( hb_parc( 1 ), "r" );
else if( HB_ISNUM( 1 ) )
@@ -109,47 +115,13 @@ HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY )
if( HB_ISBLOCK( 2 ) )
{
pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
hb_retptr( ( * func )( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
}
else if( HB_ISCHAR( 2 ) )
/* NOTE: Dropping 'const' qualifier. [vszakats] */
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
if( pPassBlock )
hb_itemRelease( pPassBlock );
if( ! HB_ISPOINTER( 1 ) )
BIO_free( bio );
}
else
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY )
{
BIO * bio;
if( HB_ISPOINTER( 1 ) )
bio = hb_parptr( 1 );
else if( HB_ISCHAR( 1 ) )
bio = BIO_new_file( hb_parc( 1 ), "r" );
else if( HB_ISNUM( 1 ) )
bio = BIO_new_fd( hb_parni( 1 ), BIO_NOCLOSE );
else
bio = NULL;
if( bio )
{
PHB_ITEM pPassBlock = NULL;
if( HB_ISBLOCK( 2 ) )
{
pPassBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) );
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, hb_ssl_pem_password_cb, pPassBlock ) );
}
else if( HB_ISCHAR( 2 ) )
/* NOTE: Dropping 'const' qualifier. [vszakats] */
hb_retptr( PEM_read_bio_RSAPrivateKey( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
hb_retptr( ( * func )( bio, NULL, NULL, ( void * ) hb_parc( 2 ) ) );
}
if( pPassBlock )
hb_itemRelease( pPassBlock );
@@ -161,39 +133,39 @@ HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY )
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
HB_FUNC( PEM_READ_BIO_PRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PrivateKey ); }
HB_FUNC( PEM_READ_BIO_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PUBKEY ); }
HB_FUNC( PEM_READ_BIO_RSAPRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSAPrivateKey ); }
HB_FUNC( PEM_READ_BIO_RSAPUBLICKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSAPublicKey ); }
HB_FUNC( PEM_READ_BIO_RSA_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_RSA_PUBKEY ); }
HB_FUNC( PEM_READ_BIO_DSAPRIVATEKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSAPrivateKey ); }
HB_FUNC( PEM_READ_BIO_DSA_PUBKEY ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSA_PUBKEY ); }
HB_FUNC( PEM_READ_BIO_DSAPARAMS ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DSAparams ); }
HB_FUNC( PEM_READ_BIO_DHPARAMS ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_DHparams ); }
HB_FUNC( PEM_READ_BIO_X509 ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509 ); }
HB_FUNC( PEM_READ_BIO_X509_AUX ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_AUX ); }
HB_FUNC( PEM_READ_BIO_X509_REQ ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_REQ ); }
HB_FUNC( PEM_READ_BIO_X509_CRL ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_X509_CRL ); }
HB_FUNC( PEM_READ_BIO_PKCS7 ) { hb_PEM_read_bio( ( PEM_READ_BIO * ) PEM_read_bio_PKCS7 ); }
#if 0
EVP_PKEY * PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
EVP_PKEY * PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
RSA * PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
RSA * PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
RSA * PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x, pem_password_cb *cb, void *u);
DSA * PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
DSA * PEM_read_bio_DSA_PUBKEY(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
DSA * PEM_read_bio_DSAparams(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
DH * PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u);
X509 * PEM_read_bio_X509(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
X509 * PEM_read_bio_X509_AUX(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
X509_REQ * PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x, pem_password_cb *cb, void *u);
X509_CRL * PEM_read_bio_X509_CRL(BIO *bp, X509_CRL **x, pem_password_cb *cb, void *u);
PKCS7 * PEM_read_bio_PKCS7(BIO *bp, PKCS7 **x, pem_password_cb *cb, void *u);
int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);
int PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_DSA_PUBKEY(BIO *bp, DSA *x);
int PEM_write_bio_DSAparams(BIO *bp, DSA *x);
int PEM_write_bio_DHparams(BIO *bp, DH *x);
int PEM_write_bio_X509(BIO *bp, X509 *x);
int PEM_write_bio_X509_AUX(BIO *bp, X509 *x);
int PEM_write_bio_X509_REQ(BIO *bp, X509_REQ *x);
int PEM_write_bio_X509_REQ_NEW(BIO *bp, X509_REQ *x);
int PEM_write_bio_X509_CRL(BIO *bp, X509_CRL *x);
int PEM_write_bio_PKCS7(BIO *bp, PKCS7 *x);
int PEM_write_bio_RSAPrivateKey( BIO *bp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_DSAPrivateKey( BIO *bp, DSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PrivateKey( BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PKCS8PrivateKey( BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr , int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid , char *kstr , int klen, pem_password_cb *cb, void *u);
int PEM_write_bio_PUBKEY( BIO *bp, EVP_PKEY *x);
int PEM_write_bio_RSAPublicKey( BIO *bp, RSA *x);
int PEM_write_bio_RSA_PUBKEY( BIO *bp, RSA *x);
int PEM_write_bio_DSA_PUBKEY( BIO *bp, DSA *x);
int PEM_write_bio_DSAparams( BIO *bp, DSA *x);
int PEM_write_bio_DHparams( BIO *bp, DH *x);
int PEM_write_bio_X509( BIO *bp, X509 *x);
int PEM_write_bio_X509_AUX( BIO *bp, X509 *x);
int PEM_write_bio_X509_REQ( BIO *bp, X509_REQ *x);
int PEM_write_bio_X509_REQ_NEW( BIO *bp, X509_REQ *x);
int PEM_write_bio_X509_CRL( BIO *bp, X509_CRL *x);
int PEM_write_bio_PKCS7( BIO *bp, PKCS7 *x);
#endif

View File

@@ -0,0 +1,54 @@
/*
* $Id$
*/
/*
* Copyright 2009 Viktor Szakats (harbour.01 syenar.hu)
* www - http://www.harbour-project.org
*/
#include "simpleio.ch"
#include "hbssl.ch"
PROCEDURE Main()
LOCAL cString
LOCAL bio
? ERR_load_PEM_strings()
? OpenSSL_add_all_algorithms()
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
? PEM_READ_BIO_RSAPRIVATEKEY( "privkey.pem", "test" )
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
? PEM_READ_BIO_RSAPUBLICKEY( "privkey.pem", "test" )
#pragma __cstream|cString:=%s
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7EDF8C06409FC8D1
w2i5vWLCOvrExPC4+FMwGQBwxXdGE7FY5Jgr6UstEN+b6l7UVSdRXEkT/Ng6RDZF
jViFPKBSrTAzEnvyNesqPBZMwRPKSEZSj+XcS/dHoz7hrbFTNBzKmDL8CJ67k2Lw
4UwtTtmTkU6L++NTfP6ImvxfaQYCkFK9D42qB7pzAAA27aGZMJCotECqVrekeCed
Tx7EMa7Vf2ToGTsvHBphy7Nwe/8Kijdb0wQIj0ZQWGa2vkYjICauAz9vfOv1xaXe
+H90c6xhVqRCv0uum3pGkqsrdJm0mBnr1gstFEDI+S1Lwr80WWBSQjCBsytfxc8j
dNXG8qXm59/n01vfHaZTtStd6mVa+eJwNRMHP0pisoxCTBPTtF/LOaZvOlbYB+r4
Hbxs5Bp0+YZp9RIipA3uagvtcTk7oHzx6v72amd3egli/DL1OY/ZjvVzHe9/dh6K
LZE2mpAHXtnHe8Rlg4CSPMvyFgN2OZXfbc64FjZcglldIoLwhr7kuLzb0zWv8sOz
jOO+uKNzyjDl5R2ay9YCANUpWVGOrpRrU6C/TzbltcxyEVKk8riKAKCsYf+De3Ee
SwPgouYGV8RgfzAwhwesibA1By1cLS/alCESH+9P2R39VHPB7MzjLc8FyNe3xAQJ
VGue9TIkMgy7RW1VFWLcLsCArTEAl83bv+BQ+YaPp9aLNq8bL5vfU2od0R7LXIOe
jH09fWcojNNLfmZU0Jzy7viUiScTtNqpqoH0qPI1hkisvELqXKhW1Lpkr56Ij8IL
B0NDIZKbaPJHHPb9Ne7nQECzv0/kzmAley9UMTZ1M7fq6KYemR0LsA==
-----END RSA PRIVATE KEY-----
ENDTEXT
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), {| lWrite | QOut( "Callback", lWrite, hb_osNewLine() ), "test" } )
BIO_free( bio )
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), "test" )
BIO_free( bio )
? PEM_READ_BIO_RSAPRIVATEKEY( bio := BIO_new_mem_buf( cString ), "<wrong>" )
BIO_free( bio )
RETURN

View File

@@ -0,0 +1,18 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7EDF8C06409FC8D1
w2i5vWLCOvrExPC4+FMwGQBwxXdGE7FY5Jgr6UstEN+b6l7UVSdRXEkT/Ng6RDZF
jViFPKBSrTAzEnvyNesqPBZMwRPKSEZSj+XcS/dHoz7hrbFTNBzKmDL8CJ67k2Lw
4UwtTtmTkU6L++NTfP6ImvxfaQYCkFK9D42qB7pzAAA27aGZMJCotECqVrekeCed
Tx7EMa7Vf2ToGTsvHBphy7Nwe/8Kijdb0wQIj0ZQWGa2vkYjICauAz9vfOv1xaXe
+H90c6xhVqRCv0uum3pGkqsrdJm0mBnr1gstFEDI+S1Lwr80WWBSQjCBsytfxc8j
dNXG8qXm59/n01vfHaZTtStd6mVa+eJwNRMHP0pisoxCTBPTtF/LOaZvOlbYB+r4
Hbxs5Bp0+YZp9RIipA3uagvtcTk7oHzx6v72amd3egli/DL1OY/ZjvVzHe9/dh6K
LZE2mpAHXtnHe8Rlg4CSPMvyFgN2OZXfbc64FjZcglldIoLwhr7kuLzb0zWv8sOz
jOO+uKNzyjDl5R2ay9YCANUpWVGOrpRrU6C/TzbltcxyEVKk8riKAKCsYf+De3Ee
SwPgouYGV8RgfzAwhwesibA1By1cLS/alCESH+9P2R39VHPB7MzjLc8FyNe3xAQJ
VGue9TIkMgy7RW1VFWLcLsCArTEAl83bv+BQ+YaPp9aLNq8bL5vfU2od0R7LXIOe
jH09fWcojNNLfmZU0Jzy7viUiScTtNqpqoH0qPI1hkisvELqXKhW1Lpkr56Ij8IL
B0NDIZKbaPJHHPb9Ne7nQECzv0/kzmAley9UMTZ1M7fq6KYemR0LsA==
-----END RSA PRIVATE KEY-----