From e4ddb2421a96beba4cee32f21f9abab151f213e5 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 15 Nov 2006 17:16:04 +0000 Subject: [PATCH] - unicode upgrade - use current parameter parsing API - added keygen constants - Added keygen functions: mhash_keygen_count, mhash_get_keygen_name, mhash_keygen_uses_hash, mhash_keygen_uses_salt, mhash_get_keygen_salt_size, mhash_keygen --- ext/mhash/mhash.c | 337 ++++++++++++++++++++++++++++++------------ ext/mhash/php_mhash.h | 16 +- 2 files changed, 257 insertions(+), 96 deletions(-) diff --git a/ext/mhash/mhash.c b/ext/mhash/mhash.c index 23302fdc9a..5c5f3c577a 100644 --- a/ext/mhash/mhash.c +++ b/ext/mhash/mhash.c @@ -28,17 +28,23 @@ #include "fcntl.h" #include "php_mhash.h" -#include "mhash.h" #include "php_ini.h" #include "php_globals.h" #include "ext/standard/info.h" zend_function_entry mhash_functions[] = { + PHP_FE(mhash_count, NULL) PHP_FE(mhash_get_block_size, NULL) PHP_FE(mhash_get_hash_name, NULL) - PHP_FE(mhash_keygen_s2k, NULL) - PHP_FE(mhash_count, NULL) + PHP_FE(mhash_keygen_count, NULL) + PHP_FE(mhash_get_keygen_name, NULL) + PHP_FE(mhash_keygen_uses_hash, NULL) + PHP_FE(mhash_keygen_uses_salt, NULL) + PHP_FE(mhash_get_keygen_salt_size, NULL) + PHP_FE(mhash_keygen_uses_count, NULL) PHP_FE(mhash, NULL) + PHP_FE(mhash_keygen, NULL) + PHP_FE(mhash_keygen_s2k, NULL) {NULL, NULL, NULL} }; @@ -57,46 +63,151 @@ zend_module_entry mhash_module_entry = { ZEND_GET_MODULE(mhash) #endif -/* SALTED S2K uses a fixed salt */ -#define SALT_SIZE 8 +#define NO_ARGS() (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) + +extern const unsigned char *mhash_get_hash_name_static(hashid hash); +extern const unsigned char *mhash_get_keygen_name_static(keygenid keygen); + +/* {{{ int php_mhash */ +int php_mhash(hashid hash, const char *input_str, int input_len, const char *key_str, int key_len, char **enc, int *len TSRMLS_DC) +{ + size_t pbsize; + char *result; + MHASH mh; + + if (key_len) { + if (!(pbsize = mhash_get_hash_pblock(hash))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "HMAC incompatible hash algorithm"); + return FAILURE; + } + mh = mhash_hmac_init(hash, (char *) key_str, key_len, pbsize); + } else { + mh = mhash_init(hash); + } + + if (mh == MHASH_FAILED) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mhash initialization failed"); + return FAILURE; + } + + mhash(mh, input_str, input_len); + + if (key_len) { + result = mhash_hmac_end(mh); + } else { + result = mhash_end(mh); + } + + if (!result) { + return FAILURE; + } + + *len = mhash_get_block_size(hash); + *enc = estrndup(result, *len); + + mhash_free(result); + + return SUCCESS; +} +/* }}} */ + +/* {{{ int php_mhash_keygen */ +int php_mhash_keygen(keygenid type, hashid hash1, hashid hash2, const char *pass_str, int pass_len, const char *salt_str, size_t salt_len, char **key, int *len, int max_len, int max_count TSRMLS_DC) +{ + KEYGEN keygen; + + if (type < 0 || type > mhash_keygen_count()) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "unknown keygen type %d", type); + return FAILURE; + } + + memset(&keygen, 0, sizeof(keygen)); + + if (mhash_keygen_uses_hash_algorithm(type)) { + if (hash1 == -1) { + hash1 = hash2; + } + if (hash2 == -1) { + hash2 = hash1; + } + keygen.hash_algorithm[0] = hash1; + keygen.hash_algorithm[1] = hash2; + } + + if (mhash_keygen_uses_salt(type)) { + if (salt_len <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s requires a salt", mhash_get_keygen_name_static(type)); + return FAILURE; + } + keygen.salt = (void *) salt_str; + keygen.salt_size = salt_len; + } + + keygen.count = max_count; + + if (max_len > 0) { + *len = max_len; + } else { + *len = 128; + } + + *key = emalloc(*len + 1); + + if (mhash_keygen_ext(type, keygen, *key, *len, (void *) pass_str, pass_len) < 0) { + efree(*key); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "key generation failed"); + return FAILURE; + } + + (*key)[*len] = '\0'; + return SUCCESS; +} +/* }}} */ +/* {{{ PHP_MINIT */ PHP_MINIT_FUNCTION(mhash) { int i, n, l; - char *name; + const char *name; char buf[128]; - n = mhash_count() + 1; - - for (i=0; i mhash_get_keygen_salt_size(KEYGEN_S2K_SALTED)) { - 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, in_salt, salt_len); - if (salt_len < SALT_SIZE) { - memset(salt + salt_len, 0, SALT_SIZE - salt_len); - } - salt_len = SALT_SIZE; +/* {{{ proto binary mhash_keygen(int type, int hash1, int hash2, binary password[, binary salt[, int max_key_size = 128[, int bytes_count = 0]]) U + Generate a key */ +PHP_FUNCTION(mhash_keygen) +{ + long hash1, hash2, type, max_len = 0, bytes_count = 0; + char *result_str, *pass_str, *salt_str = NULL; + int result_len, pass_len, salt_len = 0; - keystruct.hash_algorithm[0] = hash; - keystruct.hash_algorithm[1] = hash; - keystruct.count = 0; - keystruct.salt = salt; - keystruct.salt_size = salt_len; - - ret = emalloc(bytes + 1); + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lllS|Sll", &type, &hash1, &hash2, &pass_str, &pass_len, &salt_str, &salt_len, &max_len, &bytes_count)) { + return; + } + if (SUCCESS != php_mhash_keygen(type, hash1, hash2, pass_str, pass_len, salt_str, salt_len, &result_str, &result_len, max_len, bytes_count TSRMLS_CC)) { + RETURN_FALSE; + } + RETURN_STRINGL(result_str, result_len, 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_docref(NULL TSRMLS_CC, E_WARNING, "mhash key generation failed"); - efree(ret); +/* {{{ proto binary mhash_keygen_s2k(int hash, binary input_password, binary salt, int bytes) + Generates a key using hash functions */ +PHP_FUNCTION(mhash_keygen_s2k) +{ + long hash, max_len = 0; + char *result_str, *pass_str, *salt_str = NULL; + int result_len, pass_len, salt_len = 0; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lSSl", &hash, &pass_str, &pass_len, &salt_str, &salt_len, &max_len)) { + return; + } + if (SUCCESS != php_mhash_keygen(KEYGEN_S2K_SALTED, hash, hash, pass_str, pass_len, salt_str, salt_len, &result_str, &result_len, max_len, 0 TSRMLS_CC)) { RETURN_FALSE; } + RETURN_STRINGL(result_str, result_len, 0); } /* }}} */ diff --git a/ext/mhash/php_mhash.h b/ext/mhash/php_mhash.h index 41be456e62..10bb26cd02 100644 --- a/ext/mhash/php_mhash.h +++ b/ext/mhash/php_mhash.h @@ -29,16 +29,28 @@ #include "internal_functions.h" #endif +#include "mhash.h" + extern zend_module_entry mhash_module_entry; #define mhash_module_ptr &mhash_module_entry +int php_mhash(hashid hash, const char *input_str, int input_len, const char *key_str, int key_len, char **enc, int *len TSRMLS_DC); +int php_mhash_keygen(keygenid type, hashid hash1, hashid hash2, const char *pass_str, int pass_len, const char *salt_str, size_t salt_len, char **key, int *len, int max_len, int max_count TSRMLS_DC); + PHP_MINIT_FUNCTION(mhash); PHP_MINFO_FUNCTION(mhash); +PHP_FUNCTION(mhash_count); PHP_FUNCTION(mhash_get_block_size); PHP_FUNCTION(mhash_get_hash_name); -PHP_FUNCTION(mhash_count); -PHP_FUNCTION(mhash_keygen_s2k); +PHP_FUNCTION(mhash_keygen_count); +PHP_FUNCTION(mhash_get_keygen_name); +PHP_FUNCTION(mhash_keygen_uses_hash); +PHP_FUNCTION(mhash_keygen_uses_salt); +PHP_FUNCTION(mhash_get_keygen_salt_size); +PHP_FUNCTION(mhash_keygen_uses_count); PHP_FUNCTION(mhash); +PHP_FUNCTION(mhash_keygen); +PHP_FUNCTION(mhash_keygen_s2k); #else #define mhash_module_ptr NULL -- 2.40.0