@@ -729,6 +729,29 @@ PHP_FUNCTION(hash_pbkdf2)
729
729
}
730
730
/* }}} */
731
731
732
+ PHP_FUNCTION (hash_equals )
733
+ {
734
+ char * known , * given , * known_padded ;
735
+ int known_len , given_len , i , result ;
736
+
737
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ss" , & known , & known_len , & given , & given_len ) == FAILURE ) {
738
+ return ;
739
+ }
740
+
741
+ known_padded = (char * )ecalloc (1 , known_len + given_len );
742
+ memcpy (known , known_padded , known_len );
743
+
744
+ result = known_len - given_len ;
745
+
746
+ for (i = 0 ; i < given_len ; ++ i ) {
747
+ result |= given [i ] ^ known_padded [i ];
748
+ }
749
+
750
+ efree (known_padded );
751
+
752
+ RETVAL_BOOL (result == 0 );
753
+ }
754
+
732
755
/* Module Housekeeping */
733
756
734
757
static void php_hash_dtor (zend_rsrc_list_entry * rsrc TSRMLS_DC ) /* {{{ */
@@ -881,6 +904,7 @@ PHP_FUNCTION(mhash_get_block_size)
881
904
}
882
905
/* }}} */
883
906
907
+
884
908
#define SALT_SIZE 8
885
909
886
910
/* {{{ proto string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes)
@@ -1178,6 +1202,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mhash, 0, 0, 2)
1178
1202
ZEND_END_ARG_INFO ()
1179
1203
#endif
1180
1204
1205
+ ZEND_BEGIN_ARG_INFO (arginfo_hash_equals , 0 )
1206
+ ZEND_ARG_INFO (0 , known )
1207
+ ZEND_ARG_INFO (0 , given )
1208
+ ZEND_END_ARG_INFO ()
1209
+
1181
1210
/* }}} */
1182
1211
1183
1212
/* {{{ hash_functions[]
@@ -1198,6 +1227,7 @@ const zend_function_entry hash_functions[] = {
1198
1227
1199
1228
PHP_FE (hash_algos , arginfo_hash_algos )
1200
1229
PHP_FE (hash_pbkdf2 , arginfo_hash_pbkdf2 )
1230
+ PHP_FE (hash_equals , arginfo_hash_equals )
1201
1231
1202
1232
/* BC Land */
1203
1233
#ifdef PHP_HASH_MD5_NOT_IN_CORE
0 commit comments