/** * @brief Adds padding @a padding_type to @a text * @param return_value Result, possibly padded * @param text Message to be padded * @param mode Encryption mode; padding is applied only in CBC or ECB mode * @param block_size Cipher block size * @param padding_type Padding scheme * @see http://www.di-mgt.com.au/cryptopad.html */ static void phalcon_crypt_pad_text(zval *return_value, zval *text, zval *mode, uint block_size, int padding_type TSRMLS_DC) { uint padding_size, i; char padding[256]; char *str_mode; assert(Z_TYPE_P(text) == IS_STRING); assert(Z_TYPE_P(mode) == IS_STRING); padding_size = 0; str_mode = Z_STRVAL_P(mode); if (!strcmp(str_mode, "ecb") || !strcmp(str_mode, "cbc")) { padding_size = block_size - (Z_STRLEN_P(text) % block_size); if (padding_size >= 256) { RETURN_MM_FALSE; } switch (padding_type) { case PHALCON_CRYPT_PADDING_ANSI_X_923: memset(padding, 0, padding_size - 1); padding[padding_size-1] = (unsigned char)padding_size; break; case PHALCON_CRYPT_PADDING_PKCS7: memset(padding, padding_size, padding_size); break; case PHALCON_CRYPT_PADDING_ISO_10126: for (i = 0; i < padding_size - 1; ++i) { padding[i] = (unsigned char)rand(); } padding[padding_size - 1] = (unsigned char)padding_size; break; case PHALCON_CRYPT_PADDING_ISO_IEC_7816_4: padding[0] = 0x80; memset(padding + 1, 0, padding_size - 1); break; case PHALCON_CRYPT_PADDING_ZERO: memset(padding, 0, padding_size); break; case PHALCON_CRYPT_PADDING_SPACE: memset(padding, 0x20, padding_size); break; default: padding_size = 0; break; } } if (!padding_size) { ZVAL_ZVAL(return_value, text, 1, 0); } else { assert(padding_size <= block_size); phalcon_concat_vs(&return_value, text, padding, padding_size, 0 TSRMLS_CC); } }
void phalcon_concat_svvs(zval *result, const char *op1, uint32_t op1_len, zval *op2, zval *op3, const char *op4, uint32_t op4_len, int self_var){ phalcon_concat_sv(result, op1, op1_len, op2, self_var); phalcon_concat_vs(result, op3, op4, op4_len, 1); }
void phalcon_concat_vsvvv(zval *result, zval *op1, const char *op2, uint32_t op2_len, zval *op3, zval *op4, zval *op5, int self_var){ phalcon_concat_vs(result, op1, op2, op2_len, self_var); phalcon_concat_vvv(result, op3, op4, op5, 1); }
void phalcon_concat_vvvvsvv(zval *result, zval *op1, zval *op2, zval *op3, zval *op4, const char *op5, uint32_t op5_len, zval *op6, zval *op7, int self_var){ phalcon_concat_vvv(result, op1, op2, op3, self_var); phalcon_concat_vs(result, op4, op5, op5_len, 1); phalcon_concat_vv(result, op6, op7, 1); }
void phalcon_concat_vsvsvsv(zval *result, zval *op1, const char *op2, uint32_t op2_len, zval *op3, const char *op4, uint32_t op4_len, zval *op5, const char *op6, uint32_t op6_len, zval *op7, int self_var){ phalcon_concat_vs(result, op1, op2, op2_len, self_var); phalcon_concat_vs(result, op3, op4, op4_len, 1); phalcon_concat_vsv(result, op5, op6, op6_len, op7, 1); }