/* set encryption key */ void hb_znetEncryptKey( PHB_ZNETSTREAM pStream, const void * keydata, int keylen ) { if( pStream->crypt == 0 ) { pStream->crypt = 1; /* initialize encryption key */ pStream->bf = ( HB_BLOWFISH * ) hb_xgrab( sizeof( HB_BLOWFISH ) ); hb_blowfishInit( pStream->bf, keydata, keylen ); /* initialize input buffer */ pStream->skip_in = 0; pStream->crypt_size = 0; pStream->crypt_in = pStream->rd.avail_in; pStream->rd.avail_in = 0; /* initialize output buffer */ pStream->crypt_out = pStream->wr.next_out; pStream->wr.next_out += 2; if( pStream->wr.avail_out < 2 ) pStream->skip_out = 2 - pStream->wr.avail_out; else pStream->skip_out = 0; pStream->wr.avail_out -= 2 - pStream->skip_out; } }
static PHB_SOCKEX s_sockexNext( PHB_SOCKEX pSock, PHB_ITEM pParams ) { PHB_SOCKEX pSockNew = NULL; if( pSock ) { const void * keydata = NULL, * iv = NULL; int keylen = 0, ivlen = 0; hb_socekxParamsGetStd( pParams, &keydata, &keylen, &iv, &ivlen, NULL, NULL ); if( keylen > 0 ) { PHB_SOCKEX_BF pBF = ( PHB_SOCKEX_BF ) hb_xgrabz( sizeof( HB_SOCKEX_BF ) ); const HB_BYTE * pVect = ( const HB_BYTE * ) ( ivlen > 0 ? iv : NULL ); int i; hb_blowfishInit( &pBF->bf, keydata, keylen ); for( i = 0; i < HB_BF_CIPHERBLOCK; ++i ) { if( pVect && ivlen > 0 ) pBF->encounter[ i ] = pBF->decounter[ i ] = pVect[ i % ivlen ]; else pBF->encounter[ i ] = pBF->decounter[ i ] = ( HB_BYTE ) i; } pSockNew = ( PHB_SOCKEX ) hb_xgrabz( sizeof( HB_SOCKEX ) ); pSockNew->sd = pSock->sd; pSockNew->fRedirAll = HB_TRUE; pSockNew->fShutDown = pSock->fShutDown; pSockNew->iAutoFlush = pSock->iAutoFlush; pSockNew->pFilter = &s_sockFilter; pSockNew->cargo = ( void * ) pBF; pBF->sock = pSock; hb_socekxParamsInit( pSockNew, pParams ); } } return pSockNew; }