2011-06-27 16 views
6

Estoy intentando llamar a RNGCryptoServiceProvider-> GetBytes() desde PHP a través de la capa COM. Puedo hacer que se conecte a la clase, pero cada vez que llamo al método, aparece uno de dos errores (relacionados con el parámetro). Creo que tiene algo que ver con el hecho de que GetBytes toma una matriz de bytes de tamaño fijo por referencia. A partir de PHP no soporta las cadenas de tamaño fijo, que es donde se pone interesante:Llamar a RNGCrypto desde clase DOTNET de COM desde PHP

de error 1:

$util = new \DOTNET(
    'mscorlib', 
    'System.Security.Cryptography.RNGCryptoServiceProvider' 
); 
$data = new \Variant(str_repeat(chr(46), $size), VT_UI1 | VT_ARRAY); 
$util->GetBytes($data); 

Error [0x80070057] El parámetro es incorrecto

que se lanza por la línea ->GetBytes().

Si no utilizo una variante, pero solo uso una cadena simple, sigo recibiendo el mismo error.

Sin embargo, si paso en una matriz de este modo:

$data = array(''); 
$util->GetBytes($data); 

Parámetro 0: tipo incorrecto.

Así que creo que el enfoque de variante/cadena es el correcto (ya que pasa la comprobación del tipo de parámetro). Pero no puedo entender cómo hacerlo funcionar.

El C# interface to the method es:

public override void GetBytes(
    byte[] data 
) 

Gracias

+0

Puede que no sea la solución que está buscando, pero ¿por qué no crear un servicio simple de Windows que reciba lo que quiera enviar desde PHP y luego devolver el valor codificado (hacer todo el procesamiento en C#)? –

+2

@GustavoRubio esto es para el código de la biblioteca. En realidad, es parte de un PRNG portátil que intenta generar una fuerte aleatoriedad en todas las plataformas. Entonces los servicios o cualquier otra cosa que no sean llamadas al sistema no son realmente aceptables (por lo que estoy haciendo). Buena idea, aunque ... – ircmaxell

Respuesta

3

Ha sido años desde que toqué PHP, y mucho menos tratado de Interop con .NET, pero lo que si se crea una cadena, acolchado en su longitud deseada y descomprimir()?

$byte_array = unpack('C*', '12345678'); 
$util->GetBytes($byte_array); 

de cría, desperdicia una o dos horas a jugar con él a ningún resultado. Me gustaría tener un vistazo a esto:

http://www.sitepoint.com/forums/showthread.php?766246-PHP-and-NET-Secure-RndNum-Generation-using-DOTNET-class

dos opciones razonables allí - construir un simple envoltorio de algún tipo por lo que sólo puede llamar a un método sin parámetros, o usar algo incorporado y multiplataforma.

+0

Gracias hombre. Ya encontré ese hilo ... Estaba buscando una solución de Windows para cuando 'mcrypt' está deshabilitado. –

+1

Desde un punto de vista práctico, sí, usar 'mcrypt_create_iv' o un objeto envoltorio personalizado sería útil en una aplicación específica. Esta pregunta es más para un uso genérico, donde no se puede instalar un objeto contenedor (sin acceso) y no se puede controlar si mcrypt está instalado o no (tampoco acceso) ... Dado que COM está habilitado, con suerte allí habría ser un método para hacer esto ... – ircmaxell

+0

aquí, tomar la recompensa de todos modos para intentar: P –