Nisu - UJI

ActiveX del clauer

Marzo 2006

by Manuel Mollar
mm at nisu.org

Contenido.

  1. Funciones.
    1. getClauerSoftVersion ()
    2. getClauersList ()
    3. setClauerActive (cla)
    4. getClauerId ()
    5. setClauerCryptoMode ()
    6. setClauerClearMode ()
    7. getClauerToken (name, pwd, challenge)
  2. Ejemplos.
    1. Autoinstalación del soft al insertar el CD de demo.
    2. Usuario y contraseña vs. dispositivo.
    3. "Cambio" de contraseña de la credencial.
    4. Tomar la credencial del dispositivo insertado.

Funciones.

Funciones del ActiveX. Todas las funciones que abren una sesión contra el operativo, la cierran nada más acabar.
  • getClauerSoftVersion ()

    Devuelve la versión del software del Clauer en formato fecha.
  • getClauersList ()

    Actualmente (10 Mar 2006) no implementada.
    Devuelve la lista de dispositivos insertados en el sistema como un array javascript.
  • setClauerActive (cla,uniq)

    Elije el dispositivo con el que trabajan el resto de funciones.
    El prámetro cla es el path de un dispositivo, según devuelve la función anterior.
    Si cla es "", coje el primero.
    Si uniq es true, comprueba el ident único del dispositivo, y si no es el esperado, no activa el dispositivo. Si es false, la comprobación no se realiza. Debe usarse false sólo si se permite copiar indiscriminadamente los dispositivos al usuario o en páginas demostrativas.
    Si funciona, devuelve 1, si no, devuelve 0.
  • getClauerId ()

    Devuelve el identificador del dispositivo activo o '' si falla.
  • setClauerCryptoMode (pwd)

    Si no se especifica pwd, solicita la contraseña del dispositivo activo. Prueba la contraseña y
    Si funciona bien, devuelve 1, si no es la contraseña correcta o no hay dispositivo activo, devuelve 0
    Si lo es, todos los accesos posteriores al dispositivo serán con contraseña, que queda guardada en memoria.
  • setClauerClearMode ()

    Cancela la anterior función, limpiando la contraseña.
  • setClauerPwd (pwd)

    Una vez llamada setClauerCryptoMode, esta función cambia la contraseña del dispositivo.
  • getClauerToken (name, pwd, challenge)

    Accede a la credencial dada por name (máx 24 car.) y devuelve su valor.
    Si la credencial no existe, devuelve ''. Nótese que si la cartera está protegida y no se llama a setClauerCryptoMode, la credencial no se hallará en el dispositivo.
    Si la credencial no tiene condición, pregunta al usuario si concede el acceso y devuelve '' si se deniega.
    Si la credencial tiene condición, ésta se aplica como expresión regular a la URL de la página, y si no coincide, se muestra un error y devuelve ''.
    Si pwd no es "", el valor devuelto es el valor de la credencial cifrado con arc4, usando pwd como contraseña. La longitud máxima usable de pwd es 24.
    Si challenge no es "", el valor devuelto es challenge cifrado con arc4, usando como contraseña el valor de la credencial (cifrado con pwd si procede). La longitud de challenge debería ser (al menos) de 24 bytes, y está limitada a 288 bytes.

Ejemplos.

Autoinstalación del soft al insertar el CD de demo. ^

El CD contiene un archivo autorun.inf con:
      	[autorun]
      	shellexecute=install.js
      	
El archivo install.js detecta si está instalado el soft y lo instala si procede:
      	instalar=true;
      	try {
      	  var Clauer = new ActiveXObject("CryptoNisu.Clauer");
      	  if (Clauer.getClauerSoftVersion() >= 20060401)
      	    instalar=false;
      	}
      	catch(e) {
      	}
      	if (instalar) {
      	  var WS = new ActiveXObject("WScript.Shell"); 
      	  WS.Run("setup-base.exe",1,true);
      	}
      	

Usuario y contraseña vs. dispositivo. ^

Se trata de compatibilizar usuario y contraseña con el uso del dispositivo, en este caso sin contraseña para la credencial. En el cliente, si el dispositivo está insertado el formulario se envía automáticamente, si no, solicita usuario y contraseña. Dentro de una página web, parece que debe instanciarse usando <object> y no con ActiveXObject.
      	<form name=formu ... >
      	<input type=hidden name=vCred>
      	<object id="Clauer" classid="CLSID:EF9DBF85-F6AE-44A9-A0F2-344212E39382" width=0 height=0>
      	</object>
      	<script>
      	  try {
      	    if (Clauer.setClauerActive('',true)) {
      	      // utilizar Clauer.setClauerCryptoMode(); si la cartera está protegida
      	      vCred.value=Clauer.getClauerToken ('Credencial','','');
      	      if (vCred.value != '') {
      	        // Clauer.setClauerClearMode();
      	        formu.submit();
      	      }
      	    }
      	  }
      	  catch(e) { }
      	</script>
      	Usuario: <input name=user><br>
      	Contraseña: <input name=pwd type=password> <input type=submit value=Enviar>
      	</form>
      	
En el servidor (PHP):
      	if ($vCred=$_GET['vCred'])
      	  auth_credencial($vCred);
      	else
      	  auth_user($_GET['user'],$_GET['pwd']);
      	

"Cambio" de contraseña de la credencial. ^

Sin modificar para nada la cartera, podemos cambiar la contraseña de la credencial si es 100% aleatoria, pues lo único que hay que cambiar es el resultado. Es decir, se supone que el servidor tiene el resultado de getClauerToken con una contraseña determinada. Basta con enviar este resultado con la contraseña actual para autenticarse y el resultado de la nueva para que el servidor lo guarde.
      	<object id="Clauer" ...></object>
      	<form method=post ... onsubmit="
      	  if (pwdNueva.value != pwdNueva2.value) {
      	    alert("La nueva contraseña no coincide");
      	    return false;
      	  }
      	  else {
      	    try {
      	      // siempre sin reto
      	      if (! Clauer.setClauerActive('',true)) {
      	        alert("Introduzca el dispositivo");
      	        return false;
      	      }
      	      pwdAct=Clauer.getClauerToken('MiCredencial',pwdAct.value,'');
      	      if (pwdAct == '') {
      	        alert("Dispositivo incorrecto, deje sólo el dispositivo que corresponde");
      	        return false;
      	      }
      	      pwdNueva=Clauer.getClauerToken('MiCredencial',pwdNueva.value,'');
      	      return true;
      	    }
      	    catch (e) { }
      	  }">
      	Contraseña actual: <input name=pwdAct type=password><br>
      	Nueva contraseña: <input name=pwdNueva type=password><br>
      	Otra vez: <input name=pwdNueva2 type=password> <input type=submit value=Cambiar>
      	</form>
      	
Y en el servidor:
      	if ( auth_credencial($_POST['pwdAct']) )
      	  actualiza_credencial($_POST['pwdAct'],$_POST['pwdNueva']);
      	

Tomar la credencial del dispositivo insertado. ^

Se trata de detectar si hay dispositivo insertado y dar la opción de tomar la credencial, una vez el usuario está autenticado.
      	<form method=post name=formu ... >
      	<object id="Clauer" ...></object>
      	<script>
      	  try {
      	    if (Clauer.setClauerActive('',true)) {
      	      cred=getClauerToken('La credencial','','');
      	      if (cred != '') {
      	        // sólo escribe si hay un dispositivo con esa credencial
      	        document.write('<br><input name=vCred type=checkbox> Cojer este dispositivo para identificarse');
      	        formu.vCred.value=cred;
      	      }
      	  }
      	  catch(e) { }
      	}
      	</script>
      	</form>
      	
Como mejora, podría usarse setTimeout para detectar la inserción de un dispositivo válido:
      	function detect() {
      	  ...
      	  if (Clauer.setClauerActive('',true)) {
      	    ...
      	  else
      	    setTimeout('detect()',1000);
      	
Y en el servidor (usuario autenticado):
      	if (vCred=$POST['vCred'])
      	  update ...
      	

Temas relacionados.

Select Style - Legal