]> granicus.if.org Git - php/commitdiff
add mcrypt_create_iv()
authorSascha Schumann <sas@php.net>
Sun, 25 Apr 1999 21:09:07 +0000 (21:09 +0000)
committerSascha Schumann <sas@php.net>
Sun, 25 Apr 1999 21:09:07 +0000 (21:09 +0000)
ext/mcrypt/mcrypt.c
ext/mcrypt/php_mcrypt.h

index b36f17dda0c9df6bba1db04b3dc31aa0a72aa86a..87e62716067decd15decddf599415d7e4c59b5ac 100644 (file)
@@ -31,6 +31,8 @@
 
 #if HAVE_LIBMCRYPT
 
+#include "fcntl.h"
+
 #include "php_mcrypt.h"
 
 #include "lcrypt.h"
@@ -41,6 +43,7 @@ function_entry mcrypt_functions[] = {
        PHP_FE(mcrypt_cfb, NULL)
        PHP_FE(mcrypt_get_block_size, NULL)
        PHP_FE(mcrypt_get_key_size, NULL)
+       PHP_FE(mcrypt_create_iv, NULL)
        {0},
 };
 
@@ -74,6 +77,16 @@ static mcrypt_global_struct mcryptg;
 
 static int php3_minit_mcrypt(INIT_FUNC_ARGS)
 {
+       /* modes for mcrypt_??? routines */
+       REGISTER_LONG_CONSTANT("MCRYPT_ENCODE", 0, 0);
+       REGISTER_LONG_CONSTANT("MCRYPT_DECODE", 1, 0);
+       
+       /* sources for mcrypt_create_iv */
+       REGISTER_LONG_CONSTANT("MCRYPT_DEV_RANDOM", 0, 0);
+       REGISTER_LONG_CONSTANT("MCRYPT_DEV_URANDOM", 1, 0);
+       REGISTER_LONG_CONSTANT("MCRYPT_RAND", 2, 0);
+       
+       /* ciphers */
        MCRYPT_ENTRY(BLOWFISH);
        MCRYPT_ENTRY(DES);
        MCRYPT_ENTRY(TripleDES);
@@ -91,6 +104,52 @@ static int php3_minit_mcrypt(INIT_FUNC_ARGS)
        return SUCCESS;
 }
 
+typedef enum {
+       RANDOM = 0,
+       URANDOM,
+       RAND
+} iv_source;
+
+/* proto mcrypt_create_iv(int size, int source)
+   create an initializing vector (IV) */
+PHP_FUNCTION(mcrypt_create_iv)
+{
+       pval *size, *psource;
+       char *iv;
+       iv_source source;
+       int i;
+
+       if(ARG_COUNT(ht) != 2 || getParameters(ht, 2, &size, &psource) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_long(size);
+       convert_to_long(psource);
+       source = psource->value.lval;
+
+       i = size->value.lval;
+       iv = ecalloc(i, 1);
+       
+       if(source == RANDOM || source == URANDOM) {
+               int fd;
+
+               fd = open(source == RANDOM ? "/dev/random" : "/dev/urandom",
+                               O_RDONLY);
+               if(fd < 0) {
+                       efree(iv);
+                       php3_error(E_WARNING, "cannot open source device");
+                       RETURN_FALSE;
+               }
+               read(fd, iv, i);
+               close(fd);
+       } else {
+               while(i--) {
+                       iv[i] = rand();
+               }
+       }
+       RETURN_STRINGL(iv, size->value.lval, 0);
+}
+
 /* proto mcrypt_get_key_size(int cipher)
    get the key size of cipher */
 PHP_FUNCTION(mcrypt_get_key_size)
index f6d3fea0ad6ccefcb561b86c58a87ab1e6797c30..c207fc72750d2b0a6b6e458ceaccc3595f81ffff 100644 (file)
@@ -11,6 +11,7 @@ PHP_FUNCTION(mcrypt_cbc);
 PHP_FUNCTION(mcrypt_cfb);
 PHP_FUNCTION(mcrypt_get_block_size);
 PHP_FUNCTION(mcrypt_get_key_size);
+PHP_FUNCTION(mcrypt_create_iv);
 
 #else
 #define mcrypt_module_ptr NULL