Beispiel #1
0
static void hb_PEM_read_bio( PEM_READ_BIO * func, HB_PEM_TYPES type )
{
   BIO * bio;

   if( hb_BIO_is( 1 ) )
      bio = hb_BIO_par( 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 pPassCallback = hb_param( 2, HB_IT_EVALITEM );
      pem_password_cb * cb;
      void * cargo, * result;

      if( pPassCallback )
      {
         cb = hb_ssl_pem_password_cb;
         cargo = pPassCallback;
      }
      else
      {
         cb = NULL;
         cargo = ( void * ) hb_parc( 2 ); /* NOTE: Dropping 'const' qualifier. [vszakats] */
      }

      result = ( *func )( bio, NULL, cb, cargo );

      if( result )
      {
         switch( type )
         {
            case hb_PEM_X509:
               hb_X509_ret( ( X509 * ) result, HB_TRUE );
               break;
            case hb_PEM_EVP_PKEY:
               hb_EVP_PKEY_ret( ( EVP_PKEY * ) result );
               break;
            case hb_PEM_ANY:
               hb_retptr( NULL );
               break;
         }
      }
      else
         hb_retptr( NULL );

      if( ! hb_BIO_is( 1 ) )
         BIO_free( bio );
   }
   else
      hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
Beispiel #2
0
static void hb_PEM_read_bio( PEM_READ_BIO * func, HB_PEM_TYPES type )
{
    BIO * bio = NULL;
    HB_BYTE * pBuffer = NULL;
    HB_SIZE nSize = 0;

    if( hb_BIO_is( 1 ) )
        bio = hb_BIO_par( 1 );
    else if( HB_ISCHAR( 1 ) )
    {
        pBuffer = hb_fileLoad( hb_parc( 1 ), 0, &nSize );
        if( pBuffer )
            bio = BIO_new_mem_buf( ( char * ) pBuffer, ( int ) nSize );
    }
    else if( HB_ISNUM( 1 ) )
        bio = BIO_new_fd( hb_parni( 1 ), BIO_NOCLOSE );

    if( bio )
    {
        PHB_ITEM pPassCallback = hb_param( 2, HB_IT_EVALITEM );
        pem_password_cb * cb;
        void * cargo, * result;

        if( pPassCallback )
        {
            cb = hb_ssl_pem_password_cb;
            cargo = pPassCallback;
        }
        else
        {
            cb = NULL;
            cargo = HB_UNCONST( hb_parc( 2 ) );  /* NOTE: Discarding 'const' qualifier, OpenSSL will memcpy() it */
        }

        result = ( *func )( bio, NULL, cb, cargo );

        if( result )
        {
            switch( type )
            {
            case hb_PEM_X509:
                hb_X509_ret( ( X509 * ) result, HB_TRUE );
                break;
            case hb_PEM_EVP_PKEY:
                hb_EVP_PKEY_ret( ( EVP_PKEY * ) result );
                break;
            case hb_PEM_ANY:
                hb_retptr( NULL );
                break;
            }
        }
        else
            hb_retptr( NULL );

        if( ! hb_BIO_is( 1 ) )
            BIO_free( bio );

        if( pBuffer )
        {
            OPENSSL_cleanse( pBuffer, ( size_t ) nSize );
            hb_xfree( pBuffer );
        }
    }
    else
        hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}