c# - Lector de tarjetas inteligentes, no puedo leer algunas tarjetas
smartcard (2)
Tengo una aplicación que utiliza un lector de tarjetas inteligentes para permitir que los usuarios accedan a partes del sistema. En un lugar no tengo problemas. Pero otro, que tiene un tipo diferente de fabricante de tarjetas tiene muchos problemas. Sigue obteniendo una identificación de cero de vuelta. Luego, mirando el registro de eventos vi esto: Y este es el código:
card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);
var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);
El segundo problema es que al intentar depurar el código, funciona a la perfección, solo así se elimina el punto de interrupción. Puedo ver el problema pero no dónde. ¿Puede alguien ayudarme por favor?
PS encontré este hilo, pero no funciona: https://superuser.com/questions/715688/smart-card-errors
Actualización: Aquí están las clases de transmisión.
public override APDUResponse Transmit(APDUCommand ApduCmd)
{
var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
byte[] ApduBuffer;
var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
var ioRequest = new SCard_IO_Request
{
m_dwProtocol = m_nProtocol,
m_cbPciLength = 8
};
// Build the command APDU
if (ApduCmd.Data == null)
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];
if (ApduCmd.Le != 0)
{
ApduBuffer[4] = ApduCmd.Le;
}
}
else
{
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];
for (var nI = 0; nI < ApduCmd.Data.Length; nI++)
{
ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
}
ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length;
}
ApduBuffer[0] = ApduCmd.Class;
ApduBuffer[1] = ApduCmd.Ins;
ApduBuffer[2] = ApduCmd.P1;
ApduBuffer[3] = ApduCmd.P2;
m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);
if (m_nLastError != 0)
{
var msg = "SCardTransmit error: " + m_nLastError;
throw new SmartCardException(msg, m_nLastError);
}
var apduData = new byte[RecvLength];
for (var nI = 0; nI < RecvLength; nI++)
{
apduData[nI] = ApduResponse[nI];
}
return new APDUResponse(apduData);
}
Actualización 2: También he intentado poner algo de Thread.Sleep ()
Bueno, si el otro sistema no acepta su tarjeta inteligente, simplemente verifique la configuración del BIOS
para la tarjeta inteligente. Hay una opción para deshabilitarlos / habilitarlos en algunos sistemas.
Compruebe que en la segunda máquina tenga todos los controladores actualizados de la tarjeta inteligente. Además, a veces es útil reemplazar el controlador proporcionado por el fabricante con el "controlador WUDF de Microsoft" - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx
Tenga en cuenta que tiene dos tipos de dispositivos detectados por el sistema operativo cuando lo conecta: el dispositivo enumerador de tarjetas inteligentes (lector de tarjetas inteligentes) y la tarjeta inteligente (a veces llamada el contenedor de tarjetas inteligentes). Un lector de tarjetas inteligentes puede contener varias tarjetas inteligentes.
Ejemplo de la tarjeta inteligente cuyo controlador se reemplazó a la fuerza con Microsoft WUDF para que la aplicación cliente (iBank2) funcione:
Los cuatro controladores de tarjeta inteligente se han reemplazado a la fuerza por el controlador básico de Microsoft para que la aplicación funcione.