44
44
45
45
static int le_mcrypt ;
46
46
47
- typedef struct _php_mcrypt {
47
+ typedef struct _php_mcrypt {
48
48
MCRYPT td ;
49
49
zend_bool init ;
50
50
} php_mcrypt ;
@@ -292,7 +292,7 @@ ZEND_DECLARE_MODULE_GLOBALS(mcrypt)
292
292
293
293
zend_module_entry mcrypt_module_entry = {
294
294
STANDARD_MODULE_HEADER ,
295
- "mcrypt" ,
295
+ "mcrypt" ,
296
296
mcrypt_functions ,
297
297
PHP_MINIT (mcrypt ), PHP_MSHUTDOWN (mcrypt ),
298
298
NULL , NULL ,
@@ -376,7 +376,7 @@ ZEND_GET_MODULE(mcrypt)
376
376
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mcryptind) == FAILURE) { \
377
377
return; \
378
378
} \
379
- ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt);
379
+ ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt);
380
380
381
381
#define MCRYPT_GET_MODE_DIR_ARGS (DIRECTORY ) \
382
382
char *dir = NULL; \
@@ -407,7 +407,7 @@ PHP_INI_END()
407
407
static void php_mcrypt_module_dtor (zend_rsrc_list_entry * rsrc TSRMLS_DC ) /* {{{ */
408
408
{
409
409
php_mcrypt * pm = (php_mcrypt * ) rsrc -> ptr ;
410
- if (pm ) {
410
+ if (pm ) {
411
411
mcrypt_generic_deinit (pm -> td );
412
412
mcrypt_module_close (pm -> td );
413
413
efree (pm );
@@ -548,7 +548,7 @@ PHP_MINFO_FUNCTION(mcrypt) /* {{{ */
548
548
smart_str_free (& tmp1 );
549
549
smart_str_free (& tmp2 );
550
550
php_info_print_table_end ();
551
-
551
+
552
552
DISPLAY_INI_ENTRIES ();
553
553
}
554
554
/* }}} */
@@ -563,17 +563,17 @@ PHP_FUNCTION(mcrypt_module_open)
563
563
int mode_len , mode_dir_len ;
564
564
MCRYPT td ;
565
565
php_mcrypt * pm ;
566
-
566
+
567
567
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ssss" ,
568
568
& cipher , & cipher_len , & cipher_dir , & cipher_dir_len ,
569
569
& mode , & mode_len , & mode_dir , & mode_dir_len )) {
570
570
return ;
571
571
}
572
-
572
+
573
573
td = mcrypt_module_open (
574
574
cipher ,
575
575
cipher_dir_len > 0 ? cipher_dir : MCG (algorithms_dir ),
576
- mode ,
576
+ mode ,
577
577
mode_dir_len > 0 ? mode_dir : MCG (modes_dir )
578
578
);
579
579
@@ -600,7 +600,7 @@ PHP_FUNCTION(mcrypt_generic_init)
600
600
int max_key_size , key_size , iv_size ;
601
601
php_mcrypt * pm ;
602
602
int result = 0 ;
603
-
603
+
604
604
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rss" , & mcryptind , & key , & key_len , & iv , & iv_len ) == FAILURE ) {
605
605
return ;
606
606
}
@@ -679,7 +679,7 @@ PHP_FUNCTION(mcrypt_generic)
679
679
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rs" , & mcryptind , & data , & data_len ) == FAILURE ) {
680
680
return ;
681
681
}
682
-
682
+
683
683
ZEND_FETCH_RESOURCE (pm , php_mcrypt * , & mcryptind , -1 , "MCrypt" , le_mcrypt );
684
684
PHP_MCRYPT_INIT_CHECK
685
685
@@ -692,6 +692,10 @@ PHP_FUNCTION(mcrypt_generic)
692
692
if (mcrypt_enc_is_block_mode (pm -> td ) == 1 ) { /* It's a block algorithm */
693
693
block_size = mcrypt_enc_get_block_size (pm -> td );
694
694
data_size = (((data_len - 1 ) / block_size ) + 1 ) * block_size ;
695
+ if (data_size <= 0 ) {
696
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Integer overflow in data size" );
697
+ RETURN_FALSE ;
698
+ }
695
699
data_s = emalloc (data_size + 1 );
696
700
memset (data_s , 0 , data_size );
697
701
memcpy (data_s , data , data_len );
@@ -701,7 +705,7 @@ PHP_FUNCTION(mcrypt_generic)
701
705
memset (data_s , 0 , data_size );
702
706
memcpy (data_s , data , data_len );
703
707
}
704
-
708
+
705
709
mcrypt_generic (pm -> td , data_s , data_size );
706
710
data_s [data_size ] = '\0' ;
707
711
@@ -720,11 +724,11 @@ PHP_FUNCTION(mdecrypt_generic)
720
724
php_mcrypt * pm ;
721
725
char * data_s ;
722
726
int block_size , data_size ;
723
-
727
+
724
728
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rs" , & mcryptind , & data , & data_len ) == FAILURE ) {
725
729
return ;
726
730
}
727
-
731
+
728
732
ZEND_FETCH_RESOURCE (pm , php_mcrypt * , & mcryptind , -1 , "MCrypt" , le_mcrypt );
729
733
PHP_MCRYPT_INIT_CHECK
730
734
@@ -737,6 +741,10 @@ PHP_FUNCTION(mdecrypt_generic)
737
741
if (mcrypt_enc_is_block_mode (pm -> td ) == 1 ) { /* It's a block algorithm */
738
742
block_size = mcrypt_enc_get_block_size (pm -> td );
739
743
data_size = (((data_len - 1 ) / block_size ) + 1 ) * block_size ;
744
+ if (data_size <= 0 ) {
745
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Integer overflow in data size" );
746
+ RETURN_FALSE ;
747
+ }
740
748
data_s = emalloc (data_size + 1 );
741
749
memset (data_s , 0 , data_size );
742
750
memcpy (data_s , data , data_len );
@@ -746,7 +754,7 @@ PHP_FUNCTION(mdecrypt_generic)
746
754
memset (data_s , 0 , data_size );
747
755
memcpy (data_s , data , data_len );
748
756
}
749
-
757
+
750
758
mdecrypt_generic (pm -> td , data_s , data_size );
751
759
752
760
RETVAL_STRINGL (data_s , data_size , 1 );
@@ -760,7 +768,7 @@ PHP_FUNCTION(mcrypt_enc_get_supported_key_sizes)
760
768
{
761
769
int i , count = 0 ;
762
770
int * key_sizes ;
763
-
771
+
764
772
MCRYPT_GET_TD_ARG
765
773
array_init (return_value );
766
774
@@ -829,7 +837,7 @@ PHP_FUNCTION(mcrypt_enc_is_block_algorithm)
829
837
MCRYPT_GET_TD_ARG
830
838
831
839
if (mcrypt_enc_is_block_algorithm (pm -> td ) == 1 ) {
832
- RETURN_TRUE
840
+ RETURN_TRUE
833
841
} else {
834
842
RETURN_FALSE
835
843
}
@@ -908,7 +916,7 @@ PHP_FUNCTION(mcrypt_enc_get_modes_name)
908
916
PHP_FUNCTION (mcrypt_module_self_test )
909
917
{
910
918
MCRYPT_GET_MODE_DIR_ARGS (algorithms_dir );
911
-
919
+
912
920
if (mcrypt_module_self_test (module , dir ) == 0 ) {
913
921
RETURN_TRUE ;
914
922
} else {
@@ -922,7 +930,7 @@ PHP_FUNCTION(mcrypt_module_self_test)
922
930
PHP_FUNCTION (mcrypt_module_is_block_algorithm_mode )
923
931
{
924
932
MCRYPT_GET_MODE_DIR_ARGS (modes_dir )
925
-
933
+
926
934
if (mcrypt_module_is_block_algorithm_mode (module , dir ) == 1 ) {
927
935
RETURN_TRUE ;
928
936
} else {
@@ -936,7 +944,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm_mode)
936
944
PHP_FUNCTION (mcrypt_module_is_block_algorithm )
937
945
{
938
946
MCRYPT_GET_MODE_DIR_ARGS (algorithms_dir )
939
-
947
+
940
948
if (mcrypt_module_is_block_algorithm (module , dir ) == 1 ) {
941
949
RETURN_TRUE ;
942
950
} else {
@@ -950,7 +958,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm)
950
958
PHP_FUNCTION (mcrypt_module_is_block_mode )
951
959
{
952
960
MCRYPT_GET_MODE_DIR_ARGS (modes_dir )
953
-
961
+
954
962
if (mcrypt_module_is_block_mode (module , dir ) == 1 ) {
955
963
RETURN_TRUE ;
956
964
} else {
@@ -964,7 +972,7 @@ PHP_FUNCTION(mcrypt_module_is_block_mode)
964
972
PHP_FUNCTION (mcrypt_module_get_algo_block_size )
965
973
{
966
974
MCRYPT_GET_MODE_DIR_ARGS (algorithms_dir )
967
-
975
+
968
976
RETURN_LONG (mcrypt_module_get_algo_block_size (module , dir ));
969
977
}
970
978
/* }}} */
@@ -974,7 +982,7 @@ PHP_FUNCTION(mcrypt_module_get_algo_block_size)
974
982
PHP_FUNCTION (mcrypt_module_get_algo_key_size )
975
983
{
976
984
MCRYPT_GET_MODE_DIR_ARGS (algorithms_dir );
977
-
985
+
978
986
RETURN_LONG (mcrypt_module_get_algo_key_size (module , dir ));
979
987
}
980
988
/* }}} */
@@ -985,7 +993,7 @@ PHP_FUNCTION(mcrypt_module_get_supported_key_sizes)
985
993
{
986
994
int i , count = 0 ;
987
995
int * key_sizes ;
988
-
996
+
989
997
MCRYPT_GET_MODE_DIR_ARGS (algorithms_dir )
990
998
array_init (return_value );
991
999
@@ -1011,7 +1019,7 @@ PHP_FUNCTION(mcrypt_list_algorithms)
1011
1019
& lib_dir , & lib_dir_len ) == FAILURE ) {
1012
1020
return ;
1013
1021
}
1014
-
1022
+
1015
1023
array_init (return_value );
1016
1024
modules = mcrypt_list_algorithms (lib_dir , & count );
1017
1025
@@ -1058,7 +1066,7 @@ PHP_FUNCTION(mcrypt_get_key_size)
1058
1066
{
1059
1067
char * cipher ;
1060
1068
char * module ;
1061
- int cipher_len , module_len ;
1069
+ int cipher_len , module_len ;
1062
1070
char * cipher_dir_string ;
1063
1071
char * module_dir_string ;
1064
1072
MCRYPT td ;
@@ -1069,7 +1077,7 @@ PHP_FUNCTION(mcrypt_get_key_size)
1069
1077
& cipher , & cipher_len , & module , & module_len ) == FAILURE ) {
1070
1078
return ;
1071
1079
}
1072
-
1080
+
1073
1081
td = mcrypt_module_open (cipher , cipher_dir_string , module , module_dir_string );
1074
1082
if (td != MCRYPT_FAILED ) {
1075
1083
RETVAL_LONG (mcrypt_enc_get_key_size (td ));
@@ -1087,7 +1095,7 @@ PHP_FUNCTION(mcrypt_get_block_size)
1087
1095
{
1088
1096
char * cipher ;
1089
1097
char * module ;
1090
- int cipher_len , module_len ;
1098
+ int cipher_len , module_len ;
1091
1099
char * cipher_dir_string ;
1092
1100
char * module_dir_string ;
1093
1101
MCRYPT td ;
@@ -1098,7 +1106,7 @@ PHP_FUNCTION(mcrypt_get_block_size)
1098
1106
& cipher , & cipher_len , & module , & module_len ) == FAILURE ) {
1099
1107
return ;
1100
1108
}
1101
-
1109
+
1102
1110
td = mcrypt_module_open (cipher , cipher_dir_string , module , module_dir_string );
1103
1111
if (td != MCRYPT_FAILED ) {
1104
1112
RETVAL_LONG (mcrypt_enc_get_block_size (td ));
@@ -1116,7 +1124,7 @@ PHP_FUNCTION(mcrypt_get_iv_size)
1116
1124
{
1117
1125
char * cipher ;
1118
1126
char * module ;
1119
- int cipher_len , module_len ;
1127
+ int cipher_len , module_len ;
1120
1128
char * cipher_dir_string ;
1121
1129
char * module_dir_string ;
1122
1130
MCRYPT td ;
@@ -1127,7 +1135,7 @@ PHP_FUNCTION(mcrypt_get_iv_size)
1127
1135
& cipher , & cipher_len , & module , & module_len ) == FAILURE ) {
1128
1136
return ;
1129
1137
}
1130
-
1138
+
1131
1139
td = mcrypt_module_open (cipher , cipher_dir_string , module , module_dir_string );
1132
1140
if (td != MCRYPT_FAILED ) {
1133
1141
RETVAL_LONG (mcrypt_enc_get_iv_size (td ));
@@ -1217,7 +1225,7 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
1217
1225
} else { /* dertermine smallest supported key > length of requested key */
1218
1226
use_key_length = max_key_length ; /* start with max key length */
1219
1227
for (i = 0 ; i < count ; i ++ ) {
1220
- if (key_length_sizes [i ] >= key_len &&
1228
+ if (key_length_sizes [i ] >= key_len &&
1221
1229
key_length_sizes [i ] < use_key_length )
1222
1230
{
1223
1231
use_key_length = key_length_sizes [i ];
@@ -1228,11 +1236,11 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
1228
1236
memcpy (key_s , key , MIN (key_len , use_key_length ));
1229
1237
}
1230
1238
mcrypt_free (key_length_sizes );
1231
-
1239
+
1232
1240
/* Check IV */
1233
1241
iv_s = NULL ;
1234
1242
iv_size = mcrypt_enc_get_iv_size (td );
1235
-
1243
+
1236
1244
/* IV is required */
1237
1245
if (mcrypt_enc_mode_has_iv (td ) == 1 ) {
1238
1246
if (argc == 5 ) {
@@ -1272,7 +1280,7 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
1272
1280
} else {
1273
1281
mdecrypt_generic (td , data_s , data_size );
1274
1282
}
1275
-
1283
+
1276
1284
RETVAL_STRINGL (data_s , data_size , 1 );
1277
1285
1278
1286
/* freeing vars */
@@ -1294,9 +1302,9 @@ PHP_FUNCTION(mcrypt_encrypt)
1294
1302
zval * * mode ;
1295
1303
char * cipher , * key , * data , * iv = NULL ;
1296
1304
int cipher_len , key_len , data_len , iv_len = 0 ;
1297
-
1305
+
1298
1306
MCRYPT_GET_CRYPT_ARGS
1299
-
1307
+
1300
1308
convert_to_string_ex (mode );
1301
1309
1302
1310
php_mcrypt_do_crypt (cipher , key , key_len , data , data_len , Z_STRVAL_PP (mode ), iv , iv_len , ZEND_NUM_ARGS (), MCRYPT_ENCRYPT , return_value TSRMLS_CC );
@@ -1312,7 +1320,7 @@ PHP_FUNCTION(mcrypt_decrypt)
1312
1320
int cipher_len , key_len , data_len , iv_len = 0 ;
1313
1321
1314
1322
MCRYPT_GET_CRYPT_ARGS
1315
-
1323
+
1316
1324
convert_to_string_ex (mode );
1317
1325
1318
1326
php_mcrypt_do_crypt (cipher , key , key_len , data , data_len , Z_STRVAL_PP (mode ), iv , iv_len , ZEND_NUM_ARGS (), MCRYPT_DECRYPT , return_value TSRMLS_CC );
@@ -1326,7 +1334,7 @@ PHP_FUNCTION(mcrypt_ecb)
1326
1334
zval * * mode ;
1327
1335
char * cipher , * key , * data , * iv = NULL ;
1328
1336
int cipher_len , key_len , data_len , iv_len = 0 ;
1329
-
1337
+
1330
1338
MCRYPT_GET_CRYPT_ARGS
1331
1339
1332
1340
convert_to_long_ex (mode );
@@ -1358,7 +1366,7 @@ PHP_FUNCTION(mcrypt_cfb)
1358
1366
zval * * mode ;
1359
1367
char * cipher , * key , * data , * iv = NULL ;
1360
1368
int cipher_len , key_len , data_len , iv_len = 0 ;
1361
-
1369
+
1362
1370
MCRYPT_GET_CRYPT_ARGS
1363
1371
1364
1372
convert_to_long_ex (mode );
@@ -1374,7 +1382,7 @@ PHP_FUNCTION(mcrypt_ofb)
1374
1382
zval * * mode ;
1375
1383
char * cipher , * key , * data , * iv = NULL ;
1376
1384
int cipher_len , key_len , data_len , iv_len = 0 ;
1377
-
1385
+
1378
1386
MCRYPT_GET_CRYPT_ARGS
1379
1387
1380
1388
convert_to_long_ex (mode );
@@ -1400,9 +1408,9 @@ PHP_FUNCTION(mcrypt_create_iv)
1400
1408
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Cannot create an IV with a size of less than 1 or greater than %d" , INT_MAX );
1401
1409
RETURN_FALSE ;
1402
1410
}
1403
-
1411
+
1404
1412
iv = ecalloc (size + 1 , 1 );
1405
-
1413
+
1406
1414
if (source == RANDOM || source == URANDOM ) {
1407
1415
#if PHP_WIN32
1408
1416
/* random/urandom equivalent on Windows */
0 commit comments