From 8aa43735fcc6c6633722a2b1dff6818d73ec154b Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Wed, 22 Jul 2009 23:10:18 +0000 Subject: [PATCH] 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_*( | | , | ) -> ptr | NULL To load from memory, BIO_new_mem_buf() can be used, see in test. 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. --- harbour/ChangeLog | 25 +++++ harbour/contrib/hbssl/pem.c | 128 +++++++++--------------- harbour/contrib/hbssl/tests/pem.prg | 54 ++++++++++ harbour/contrib/hbssl/tests/privkey.pem | 18 ++++ 4 files changed, 147 insertions(+), 78 deletions(-) create mode 100644 harbour/contrib/hbssl/tests/pem.prg create mode 100644 harbour/contrib/hbssl/tests/privkey.pem diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c0dba59b15..594ad2d8a4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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_*( | | , | ) -> ptr | NULL + To load from memory, BIO_new_mem_buf() can be used, see in test. + 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. diff --git a/harbour/contrib/hbssl/pem.c b/harbour/contrib/hbssl/pem.c index 5bad01ce6f..d5a1d8d5b0 100644 --- a/harbour/contrib/hbssl/pem.c +++ b/harbour/contrib/hbssl/pem.c @@ -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 diff --git a/harbour/contrib/hbssl/tests/pem.prg b/harbour/contrib/hbssl/tests/pem.prg new file mode 100644 index 0000000000..5cf0955068 --- /dev/null +++ b/harbour/contrib/hbssl/tests/pem.prg @@ -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 ), "" ) + BIO_free( bio ) + + RETURN diff --git a/harbour/contrib/hbssl/tests/privkey.pem b/harbour/contrib/hbssl/tests/privkey.pem new file mode 100644 index 0000000000..97122c8efe --- /dev/null +++ b/harbour/contrib/hbssl/tests/privkey.pem @@ -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-----