From: Ilia Alshanetsky Date: Wed, 20 Nov 2002 06:53:33 +0000 (+0000) Subject: MFH X-Git-Tag: php-4.3.0RC2~69 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=755958ac16c5db446d7b7a21edd1cf88399bdb21;p=php MFH --- diff --git a/ext/mhash/mhash.c b/ext/mhash/mhash.c index c2f22818a3..fc3a957ea6 100644 --- a/ext/mhash/mhash.c +++ b/ext/mhash/mhash.c @@ -56,22 +56,21 @@ zend_module_entry mhash_module_entry = { ZEND_GET_MODULE(mhash) #endif -#define MHASH_FAILED_MSG "mhash initialization failed" -#define MHASH_KEYGEN_FAILED_MSG "mhash key generation failed" +/* SALTED S2K uses a fixed salt */ +#define SALT_SIZE 8 static PHP_MINIT_FUNCTION(mhash) { - int i; + int i, n, l; char *name; char buf[128]; - for (i = 0; i <= mhash_count(); i++) { - name = mhash_get_hash_name(i); - if (name) { - snprintf(buf, 127, "MHASH_%s", name); - zend_register_long_constant(buf, strlen(buf) + 1, - i, CONST_PERSISTENT, - module_number TSRMLS_CC); + n = mhash_count() + 1; + + for (i=0; i 3) { + int hash; + int data_len, key_len=0; + char *data, *key=NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls|s", &hash, &data, &data_len, &key, &key_len) == FAILURE) { WRONG_PARAM_COUNT; } - if (num_args == 2) { /* 2 arguments, just hash */ - if (zend_get_parameters_ex(2, &hash, &data) == FAILURE) { - WRONG_PARAM_COUNT; - } - } else { /* 3 arguments, do HMAC hash (keyed hash) */ - if (zend_get_parameters_ex(3, &hash, &data, &key) == - FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(key); - } - - convert_to_long_ex(hash); - convert_to_string_ex(data); - - bsize = mhash_get_block_size(Z_LVAL_PP(hash)); - - if (num_args == 3) { - if (mhash_get_hash_pblock(Z_LVAL_PP(hash)) == 0) { - php_error(E_WARNING, MHASH_FAILED_MSG); + + bsize = mhash_get_block_size(hash); + + if (key_len) { + if (mhash_get_hash_pblock(hash) == 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mhash initialization failed"); RETURN_FALSE; } - td = mhash_hmac_init(Z_LVAL_PP(hash), - Z_STRVAL_PP(key), - Z_STRLEN_PP(key), - mhash_get_hash_pblock(Z_LVAL_PP(hash))); + td = mhash_hmac_init(hash, key, key_len, mhash_get_hash_pblock(hash)); } else { - td = mhash_init(Z_LVAL_PP(hash)); + td = mhash_init(hash); } + if (td == MHASH_FAILED) { - php_error(E_WARNING, MHASH_FAILED_MSG); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mhash initialization failed"); RETURN_FALSE; } - mhash(td, Z_STRVAL_PP(data), Z_STRLEN_PP(data)); + mhash(td, data, data_len); - if (num_args == 3) { + if (key_len) { hash_data = (unsigned char *) mhash_hmac_end(td); } else { hash_data = (unsigned char *) mhash_end(td); } + if (hash_data) { RETVAL_STRINGL(hash_data, bsize, 1); mhash_free(hash_data); @@ -215,69 +192,45 @@ PHP_FUNCTION(mhash) /* {{{ proto string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes) Generates a key using hash functions */ -/* SALTED S2K uses a fixed salt */ -#define SALT_SIZE 8 PHP_FUNCTION(mhash_keygen_s2k) { - pval **hash, **input_password, **bytes, **input_salt; - int password_len, salt_len; - int hashid, size=0, val; KEYGEN keystruct; char salt[SALT_SIZE], *ret; - char* password, error[128]; + int hash, bytes; + char *password, *in_salt; + int password_len, salt_len; - if (ZEND_NUM_ARGS() != 4) { - WRONG_PARAM_COUNT; - } - if (zend_get_parameters_ex(4, &hash, &input_password, &input_salt, &bytes) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lssl", &hash, &password, &password_len, &in_salt, &salt_len, &bytes) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(hash); - convert_to_string_ex(input_password); - convert_to_string_ex(input_salt); - convert_to_long_ex(bytes); - - password = Z_STRVAL_PP(input_password); - password_len = Z_STRLEN_PP(input_password); - - salt_len = MIN(Z_STRLEN_PP(input_salt), SALT_SIZE); + + salt_len = MIN(salt_len, SALT_SIZE); if (salt_len > mhash_get_keygen_salt_size(KEYGEN_S2K_SALTED)) { - sprintf( error, "The specified salt [%d] is more bytes than the required by the algorithm [%d]\n", salt_len, mhash_get_keygen_salt_size(KEYGEN_S2K_SALTED)); - - php_error(E_WARNING, error); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "The specified salt [%d] is more bytes than the required by the algorithm [%d]\n", + salt_len, mhash_get_keygen_salt_size(KEYGEN_S2K_SALTED)); } - memcpy(salt, Z_STRVAL_PP(input_salt), salt_len); - if (salt_len < SALT_SIZE) + memcpy(salt, in_salt, salt_len); + if (salt_len < SALT_SIZE) { memset(salt + salt_len, 0, SALT_SIZE - salt_len); - salt_len=SALT_SIZE; - -/* if (salt_len==0) { - * php_error(E_WARNING, "Not using salt is really not recommended); - * } - */ + } + salt_len = SALT_SIZE; - hashid = Z_LVAL_PP(hash); - size = Z_LVAL_PP(bytes); - - keystruct.hash_algorithm[0]=hashid; - keystruct.hash_algorithm[1]=hashid; - keystruct.count=0; + keystruct.hash_algorithm[0] = hash; + keystruct.hash_algorithm[1] = hash; + keystruct.count = 0; keystruct.salt = salt; keystruct.salt_size = salt_len; - ret = emalloc(size); - if (ret==NULL) { - php_error(E_WARNING, MHASH_KEYGEN_FAILED_MSG); - RETURN_FALSE; - } + ret = emalloc(bytes + 1); - val = mhash_keygen_ext( KEYGEN_S2K_SALTED, keystruct, ret, size, password, password_len); - if (val >= 0) { - RETVAL_STRINGL(ret, size, 0); + if (mhash_keygen_ext(KEYGEN_S2K_SALTED, keystruct, ret, bytes, password, password_len) >= 0) { + ret[bytes] = '\0'; + RETVAL_STRINGL(ret, bytes, 0); } else { - php_error(E_WARNING, MHASH_KEYGEN_FAILED_MSG); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mhash key generation failed"); efree(ret); RETURN_FALSE; }