コード例 #1
0
ファイル: crypt.c プロジェクト: tianhendi/cphalcon
/**
 * @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);
	}
}
コード例 #2
0
ファイル: concat.c プロジェクト: googlle/cphalcon7
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);
}
コード例 #3
0
ファイル: concat.c プロジェクト: googlle/cphalcon7
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);
}
コード例 #4
0
ファイル: concat.c プロジェクト: googlle/cphalcon7
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);
}
コード例 #5
0
ファイル: concat.c プロジェクト: googlle/cphalcon7
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);
}