<?
function TripleDESECB($sKey, $sMessage)
{
//  $sEncryptedMessage = mcrypt_ecb(MCRYPT_3DES,$sKey,$sMessage,MCRYPT_ENCRYPT);
   $td = mcrypt_module_open('tripledes', '', 'ecb', '');
   $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
   mcrypt_generic_init($td, $sKey, $iv);
   $sEncryptedMessage = mcrypt_generic($td, $sMessage);
   mcrypt_generic_deinit($td);
   mcrypt_module_close($td);
  return $sEncryptedMessage;
}


function validarCampos($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modoComunicacion,$URL_ONLINE,$mostrarResultado)
{
  //validaciones de parametros
  //Clave de Terminal
  if ($claveTerminal == null) return "ERROR EN CLAVE TERMINAL";
  if ($claveTerminal == null) return "ERROR EN CLAVE TERMINAL";
  if (strlen($claveTerminal)>13) return "ERROR EN CLAVE TERMINAL";

  //URL_OK
  if ($URL_OK == null) return "ERROR EN URL_OK";
  if ($URL_OK=="") return "ERROR EN URL_OK";
  if (strlen($URL_OK) > 99) return "ERROR EN URL_OK";

  //URL_NOK
  if ($URL_NOK == null) return "ERROR EN URL_NOK";
  if ($URL_NOK=="") return "ERROR EN URL_NOK";
  if (strlen($URL_NOK) > 99) return "ERROR EN URL_NOK";

  //numero de operacion
  if ($numOperacion < 0) return "ERROR EN NUMERO OPERACION";
  if ($numOperacion > 9999) return "ERROR EN NUMERO OPERACION";

  //referencia de comercio
  if ($refComercio == null) return "ERROR EN REFERENCIA COMERCIO";
  if (strlen($refComercio) > 10) return "ERROR EN REFERENCIA COMERCIO";

  //importeEntro
  if ($importeEntero < 0) return "ERROR EN IMPORTE ENTERO";

  //importeDecimal
  if ($importeDecimal > 99) return "ERROR EN IMPORTE DECIMAL";
  if ($importeDecimal < 0) return "ERROR EN IMPORTE DECIMAL";

  //clave de comercio (clave de tripledes
  if ($claveComercio == null) return "ERROR EN CLAVE COMERCIO";
  if (strlen($claveComercio) != 24) return "ERROR EN CLAVE DE COMERCIO";

  //codigo de moneda
  if ($tipoMoneda > 999) return "ERROR EN TIPO MONEDA";
  if ($tipoMoneda < 1) return "ERROR EN TIPO MONEDA";

  //exponente
  if ($exponente != 2) return "ERROR EN EXPONENTE";

  //pago soportado
  if ($pagoSoportado == "") return "ERROR EN PAGO SOPORTADO";
  if ($pagoSoportado == null) return "ERROR EN PAGO SOPORTADO";
  if (strlen($pagoSoportado) != 3) return "ERROR EN PAGO SOPORTADO";

  //idioma
  if ($idioma < 0) return "ERROR EN IDIOMA";
  if ($idioma > 9) return "ERROR EN IDIOMA";


  //codOperacion
  if ($codOperacion < 0) return "ERROR EN CODIGO OPERACION";
  if ($codOperacion > 99) return "ERROR EN CODIGO OPERACION";

  //modocomunicacion
  if ($modoComunicacion < 0) return "ERROR EN MODO COMUNICACION";
  if ($modoComunicacion > 9) return "ERROR EN MODO COMUNICACION";

  if ($modoComunicacion == 3)
    {
       if ($URL_ONLINE == null) $URL_ONLINE = "";
       if (!$URL_ONLINE=="") return ("ERROR EN URL_ONLINE. EN ESTE " .
                                          "ESQUEMA DEBE VALER CADENA VACIA");
       if ($mostrarResultado != 0) return ("ERROR EN MOSTRAR RESULTADO. EN ESTE" .
                                         " ESQUEMA DEBE VALER 0");
    }
  else
  {
    //URL_ONLINE
    if ($URL_ONLINE == null) return "ERROR EN URL_ONLINE";
    if ($URL_ONLINE=="") return "ERROR EN URL_ONLINE";
    if (strlen($URL_ONLINE) > 99) return "ERROR EN URL_ONLINE";

    //mostrarResultado
    if ($mostrarResultado < 0) return "ERROR EN MOSTRAR RESULTADO<0";
    if ($mostrarResultado > 1) return "ERROR EN MOSTRAR RESULTADO>1";
  }
  return "";
}//fin validar campos


//---------------------------------------
function generarHtml($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modoComunicacion,$URL_ONLINE,$mostrarResultado,$texto_cifrado)
{

    //$longitud,cont;
   $aux = "";
   $formulario = "<input type='hidden' name='OB01' value='".$claveTerminal."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB02' value='".$URL_OK."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB03' value='".$URL_NOK."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB04' value='".$texto_cifrado."'>";
   $numOperacion = $numOperacion."";
   $longitud = strlen($numOperacion);
   $longitud = 4 - $longitud;
   for ($cont=0; $cont <= $longitud; $cont ++)
      $aux = $aux . "0";

   $formulario = $formulario ."\n". "<input type='hidden' name='OB05' value='" .
                $refComercio.$aux.$numOperacion."'>";

   if (strlen($importeDecimal) == 1)
      $formulario = $formulario ."\n".
                   "<input type='hidden' name='OB06' value='".
                    $importeEntero . "0" . $importeDecimal ."'>";
   else
     $formulario = $formulario ."\n".
                   "<input type='hidden' name='OB06' value='".
                    $importeEntero . $importeDecimal ."'>";

   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB07' value='0" . $tipoMoneda . "'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB08' value='".$exponente."'>";
   $formulario = $formulario . "\n".
                "<input type='hidden' name='OB09' value='".$pagoSoportado."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB10' value='".$idioma."'>";

   if (strlen($codOperacion) == 1)
      $formulario = $formulario ."\n".
                "<input type='hidden' name='OB11' value='0".$codOperacion."'>";
   else
      $formulario = $formulario ."\n".
                "<input type='hidden' name='OB11' value='".$codOperacion."'>";

   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB12' value='".$modoComunicacion."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB13' value='".$URL_ONLINE."'>";
   $formulario = $formulario ."\n".
                "<input type='hidden' name='OB14' value='".$mostrarResultado."'>";
   return $formulario;

}//fin generarHtml





//-----------------------------------------------------------------------------
function generarCadenaFirma($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modoComunicacion,$URL_ONLINE,$mostrarResultado)
{

   //$cont, longitud;
   $texto_claro = $claveTerminal . $URL_OK . $URL_NOK . $refComercio ;
   $numOperacion = $numOperacion."";
   $longitud = strlen($numOperacion);
   $longitud = 4 - $longitud;
   for ($cont=0; $cont <= $longitud; $cont ++)
      $texto_claro = $texto_claro . "0";

   $texto_claro = $texto_claro . $numOperacion . $importeEntero;
   if (strlen($importeDecimal) == 1)
     $texto_claro = $texto_claro . "0" . $importeDecimal;
   else
     $texto_claro = $texto_claro . $importeDecimal;

   $texto_claro = $texto_claro . $modoComunicacion . $URL_ONLINE .
                 $mostrarResultado . "0" . $tipoMoneda . $exponente .
                 $pagoSoportado . $idioma;
   $codOperacion = $codOperacion."";
   if (strlen($codOperacion) == 1)
      $texto_claro = $texto_claro . "0" . $codOperacion;
  else
       $texto_claro = $texto_claro . $codOperacion;
  return $texto_claro;

}//fin generarCadenaFirma(claveTerminal,URL_OK,URL_NOK,numOperacion,refComercio,importeEntero,importeDecimal,claveComercio,tipoMoneda,exponente,pagoSoportado,idioma,codOperacion,modocomunicacion,URL_ONLINE,mostrarResultado)


//-----------------------------------------------------------------------
function CalcularFirma($cadenaFirma, $key)
{

 //Completa a multiplo de 8
 $cont_car = 0;
 $multiplo_8 = strlen($cadenaFirma) % 8;
 for ($cont_car = 0; $cont_car < (8 - $multiplo_8);$cont_car ++ )
  {
    $cadenaFirma = $cadenaFirma . (" ");
  }

 $firma =  bin2hex(mhash(MHASH_SHA1,bin2hex(TripleDESECB($key, $cadenaFirma))));
 return $firma;

}//fin CalcularFirma($cadenaFirma, $key);


//---------------------------------------
function generarFormulario($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modocomunicacion,$URL_ONLINE,$mostrarResultado)
{
        $cadenaFirma     = "";
        $firmaCalculada  = "";
        $stringHtml      = "";
        $validacion      = "";

        $validacion = validarCampos($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modocomunicacion,$URL_ONLINE,$mostrarResultado);

        if($validacion=="")
        {
                $cadenaFirma = generarCadenaFirma($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modocomunicacion,$URL_ONLINE,$mostrarResultado);

            $firmaCalculada   = CalcularFirma($cadenaFirma, $claveComercio);
            $stringHtml       = generarHtml($claveTerminal,$URL_OK,$URL_NOK,$numOperacion,$refComercio,$importeEntero,$importeDecimal,$claveComercio,$tipoMoneda,$exponente,$pagoSoportado,$idioma,$codOperacion,$modocomunicacion,$URL_ONLINE,$mostrarResultado,$firmaCalculada);
        }
        else
        {
                $stringHtml = $validacion;
        }
        return $stringHtml;
}//fin generarFormulario


function validarFirma($cadena, $clave)
{

 $posicion;
 $firmaRecibida = "";
 $firmaCalculada = "";

 $posicion = strrpos($cadena,'#');
 if ($posicion == false) return "ERROR EN PARAMETROS DE ENTRADA";

 $firmaRecibida = substr($cadena,$posicion + 1);
 $cadena = substr($cadena,0,$posicion);
 $firmaCalculada = CalcularFirma($cadena,$clave);
 if (strcmp($firmaRecibida,$firmaCalculada) == 0)
    return "";
 else
    return "FIRMA NO COINCIDE";
}


?>
