Tamam, benim ilk fonksiyonel PHP uzantısı yazdık. Bu çalıştı ama bir proof-of-concept sadece idi. Şimdi aslında patronun istediğini yapar bir tane yazıyorum.
Ben bilmek istiyorum ne, orada tüm PHP-başkanları, bu kod mantıklı olup olmadığıdır. I emalloc
ve benzeri gibi şeylerin iyi kavramak var, ya da daha sonra arkanı dön ve elimi ısırmaya denemek için gidiyor orada şeyler var mı?
Aşağıdaki fonksiyonlardan biri için kodudur. Ayrıca Blowfish şifrelenmiş bir dize bir base64 döndürür. Işlevi çağrıldığında, bu iki dizeleri, şifrelemek ve kodlamak için metin ve şifreleme aşaması için anahtarla birlikte verilir. Bu noktada, ben onları bağlamak için nasıl bilmiyorum, çünkü PHP'nin kendi base64 fonksiyonlarını kullanarak değil. Ve aynı nedenle PHP'nin kendi mcrypt fonksiyonlarını kullanarak değil. Bunun yerine, bu SSLeay BF_ecb_encrypt
fonksiyonları bağlar.
PHP_FUNCTION(Blowfish_Base64_encode)
{
char *psData = NULL;
char *psKey = NULL;
int argc = ZEND_NUM_ARGS();
int psData_len;
int psKey_len;
char *Buffer = NULL;
char *pBuffer = NULL;
char *Encoded = NULL;
BF_KEY Context;
int i = 0;
unsigned char Block[ 8 ];
unsigned char * pBlock = Block;
char *plaintext;
int plaintext_len;
int cipher_len = 0;
if (zend_parse_parameters(argc TSRMLS_CC, "ss", &psData, &psData_len, &psKey, &psKey_len) == FAILURE)
return;
Buffer = (char *) emalloc( psData_len * 2 );
pBuffer = Buffer;
Encoded = (char *) emalloc( psData_len * 4 );
BF_set_key( &Context, psKey_len, psKey );
plaintext = psData;
plaintext_len = psData_len;
for (;;)
{
if (plaintext_len--)
{
Block[ i++ ] = *plaintext++;
if (i == 8 )
{
BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
pBuffer += 8;
cipher_len += 8;
memset( Block, 0, 8 );
i = 0;
}
} else {
BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
cipher_len += 8;
break;
}
}
b64_encode( Encoded, Buffer, cipher_len );
RETURN_STRINGL( Encoded, strlen( Encoded ), 0 );
}
Ben Encoded
ve Buffer
için iki emalloc
aramaları, sahip olduğunu fark edeceksiniz. Sadece Encoded
geri çağırana geçti, ben Tampon serbest olmayacak endişeleniyorum edilmektedir. Durum böyle mi? I Buffer
için malloc / ücretsiz kullanmalı mıyım?
Başka göze batan bir hata varsa, ben gerçekten bilerek takdir ediyorum.