summaryrefslogtreecommitdiff
path: root/ext/mcrypt
diff options
context:
space:
mode:
authorSascha Schumann <sas@php.net>1999-04-25 21:11:29 +0000
committerSascha Schumann <sas@php.net>1999-04-25 21:11:29 +0000
commit22d720e00ccde2f420c13930f83e206efb9ec60c (patch)
treeb30c23dba1a2f522b1276e986cbb8bc54b8b89b2 /ext/mcrypt
parenta1a41504c782ef155da8426dc08d9cc51d8ea4d9 (diff)
downloadphp-git-22d720e00ccde2f420c13930f83e206efb9ec60c.tar.gz
add OFB mode, the final one
Diffstat (limited to 'ext/mcrypt')
-rw-r--r--ext/mcrypt/mcrypt.c50
-rw-r--r--ext/mcrypt/php_mcrypt.h1
2 files changed, 51 insertions, 0 deletions
diff --git a/ext/mcrypt/mcrypt.c b/ext/mcrypt/mcrypt.c
index 87e6271606..989d43542f 100644
--- a/ext/mcrypt/mcrypt.c
+++ b/ext/mcrypt/mcrypt.c
@@ -41,6 +41,7 @@ function_entry mcrypt_functions[] = {
PHP_FE(mcrypt_ecb, NULL)
PHP_FE(mcrypt_cbc, NULL)
PHP_FE(mcrypt_cfb, NULL)
+ PHP_FE(mcrypt_ofb, NULL)
PHP_FE(mcrypt_get_block_size, NULL)
PHP_FE(mcrypt_get_key_size, NULL)
PHP_FE(mcrypt_create_iv, NULL)
@@ -180,6 +181,55 @@ PHP_FUNCTION(mcrypt_get_block_size)
RETURN_LONG(get_block_size(cipher->value.lval));
}
+/* proto mcrypt_ofb(int cipher, string key, string data, int mode, string iv)
+ OFB crypt/decrypt data using key key with cipher cipher starting with iv */
+PHP_FUNCTION(mcrypt_ofb)
+{
+ pval *cipher, *data, *key, *mode, *iv;
+ int td;
+ char *ndata;
+ size_t bsize;
+ size_t nr;
+ size_t nsize;
+
+ if(ARG_COUNT(ht) != 5 ||
+ getParameters(ht, 5, &cipher, &key, &data, &mode, &iv) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(cipher);
+ convert_to_long(mode);
+ convert_to_string(data);
+ convert_to_string(key);
+ convert_to_string(iv);
+
+ if(iv->value.str.len != bsize) {
+ php3_error(E_WARNING, MCRYPT_IV_WRONG_SIZE);
+ RETURN_FALSE;
+ }
+
+ bsize = get_block_size(cipher->value.lval);
+ nr = (data->value.str.len + bsize - 1) / bsize;
+ nsize = nr * bsize;
+
+ td = init_mcrypt_ofb(cipher->value.lval, key->value.str.val, key->value.str.len, iv->value.str.val);
+ if(td == -1) {
+ php3_error(E_WARNING, MCRYPT_FAILED);
+ RETURN_FALSE;
+ }
+
+ ndata = ecalloc(nr, bsize);
+ memcpy(ndata, data->value.str.val, data->value.str.len);
+
+ if(mode->value.lval == 0)
+ mcrypt_ofb(td, ndata, nsize);
+ else
+ mdecrypt_ofb(td, ndata, nsize);
+
+ end_mcrypt_ofb(td);
+
+ RETURN_STRINGL(ndata, nsize, 0);
+}
+
/* proto mcrypt_cfb(int cipher, string key, string data, int mode, string iv)
CFB crypt/decrypt data using key key with cipher cipher starting with iv */
PHP_FUNCTION(mcrypt_cfb)
diff --git a/ext/mcrypt/php_mcrypt.h b/ext/mcrypt/php_mcrypt.h
index c207fc7275..70331e3bba 100644
--- a/ext/mcrypt/php_mcrypt.h
+++ b/ext/mcrypt/php_mcrypt.h
@@ -9,6 +9,7 @@ extern zend_module_entry mcrypt_module_entry;
PHP_FUNCTION(mcrypt_ecb);
PHP_FUNCTION(mcrypt_cbc);
PHP_FUNCTION(mcrypt_cfb);
+PHP_FUNCTION(mcrypt_ofb);
PHP_FUNCTION(mcrypt_get_block_size);
PHP_FUNCTION(mcrypt_get_key_size);
PHP_FUNCTION(mcrypt_create_iv);