Linux için PHP uzantısı: reality check gerekli!

0 Cevap php

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.

0 Cevap