SCardTransmit возвращает 87 (0x57), не знаю, в чем дело. SCardTransmit работает с SELECT и READ RECORD.C#

Место общения программистов C#
Ответить
Anonymous
 SCardTransmit возвращает 87 (0x57), не знаю, в чем дело. SCardTransmit работает с SELECT и READ RECORD.

Сообщение Anonymous »

Попытка отправить объект групповой политики с помощью устройства чтения карт ACR39U завершается неудачей с кодом ошибки 87 (0x57), INVALID_PARAMETERS, работает с другими устройствами чтения карт. Он также работает с SELECT и READ RECORD.
Вот мой журнал APDU.
00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
00 B2 01 0C 32
00 A4 04 00 08 A0 00 00 03 33 01 01 01
80 A8 00 00 0A 83 08 00 00 00 00 10 00 02 12 00
При использовании других устройств чтения карт он возвращает правильный ответ, но с ACR39U он всегда возвращает 87 Вот исходный код, изолирующий эту проблему. Это на C#, .NET8. Я использую ЛЮБОЙ процессор в Visual Studio. Windows 11. Карта UnionPay.

Код: Выделить всё

using System;
using System.Runtime.InteropServices;

public class SmartCardCommunication
{
[DllImport("winscard.dll")]
private static extern int SCardEstablishContext(uint dwScope, IntPtr pvReserved1, IntPtr pvReserved2, ref IntPtr phContext);

[DllImport("winscard.dll")]
private static extern int SCardReleaseContext(IntPtr hContext);

[DllImport("winscard.dll")]
private static extern int SCardListReaders(IntPtr hContext, string mszGroups, byte[] mszReaders, ref int pcchReaders);

[DllImport("winscard.dll")]
private static extern int SCardConnect(IntPtr hContext, string szReader, uint dwShareMode, uint dwPreferredProtocols, ref IntPtr phCard, ref uint pdwActiveProtocol);

[DllImport("winscard.dll")]
private static extern int SCardDisconnect(IntPtr hCard, int dwDisposition);

[DllImport("winscard.dll")]
private static extern int SCardTransmit(IntPtr hCard, ref SCARD_IO_REQUEST pioSendPci, byte[] pbSendBuffer, int cbSendLength, ref SCARD_IO_REQUEST pioRecvPci, byte[] pbRecvBuffer, ref int pcbRecvLength);

private const uint SCARD_SCOPE_USER = 0;
private const uint SCARD_SHARE_SHARED = 2;
private const uint SCARD_PROTOCOL_T0 = 1;
private const uint SCARD_PROTOCOL_T1 = 2;

[StructLayout(LayoutKind.Sequential)]
private struct SCARD_IO_REQUEST
{
public uint dwProtocol;
public uint cbPciLength;
}

public static void Main()
{
IntPtr hContext = IntPtr.Zero;
IntPtr hCard = IntPtr.Zero;
uint activeProtocol = 0;

try
{
int result = SCardEstablishContext(SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, ref hContext);
if (result != 0) throw new Exception("Failed to establish context.");

int readerSize = 0;
result = SCardListReaders(hContext, null, null, ref readerSize);
if (result != 0) throw new Exception("Failed to list readers.");

byte[] readers = new byte[readerSize];
result = SCardListReaders(hContext, null, readers, ref readerSize);
if (result != 0) throw new Exception("Failed to list readers.");

string readerName = System.Text.Encoding.ASCII.GetString(readers).Split('\0')[0];

result = SCardConnect(hContext, readerName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, ref hCard, ref activeProtocol);
if (result != 0) throw new Exception("Failed to connect to the card.");

apdu(hCard, activeProtocol, "00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 ");
apdu(hCard, activeProtocol, "00 B2 01 0C 32 ");
apdu(hCard, activeProtocol, "00 A4 04 00 08 A0 00 00 03 33 01 01 01 ");
apdu(hCard, activeProtocol, "80 A8 00 00 0A 83 08 00 00 00 00 10 00 02 12 00 ");
}
finally
{
// Clean up
if (hCard != IntPtr.Zero) SCardDisconnect(hCard, 0);
if (hContext != IntPtr.Zero) SCardReleaseContext(hContext);
}
}

static void apdu(IntPtr hCard, uint activeProtocol, string hex)
{
hex = hex.Replace(" ", "");
byte[] apduCommand = StringToByteArrayFastest(hex); // Example: SELECT command
byte[] recvBuffer = new byte[256];
int recvLength = recvBuffer.Length;

SCARD_IO_REQUEST ioRequest = new SCARD_IO_REQUEST { dwProtocol = activeProtocol, cbPciLength = (uint)Marshal.SizeOf(typeof(SCARD_IO_REQUEST)) };
SCARD_IO_REQUEST ioRequest2 = new SCARD_IO_REQUEST { dwProtocol = activeProtocol, cbPciLength = (uint)Marshal.SizeOf(typeof(SCARD_IO_REQUEST)) };

int result = SCardTransmit(hCard, ref ioRequest, apduCommand, apduCommand.Length, ref ioRequest2, recvBuffer, ref recvLength);
if (result != 0) throw new Exception("Failed to transmit APDU command.");

byte[] response = new byte[recvLength];
Array.Copy(recvBuffer, response, recvLength);
Console.WriteLine("Response: " + BitConverter.ToString(response));
}

public static byte[] StringToByteArrayFastest(string hex)
{
if (hex.Length % 2 == 1)
throw new Exception("The binary key cannot have an odd number of digits");

byte[] arr = new byte[hex.Length >>  1];

for (int i = 0; i < hex.Length >> 1; ++i)
{
arr[i] = (byte)((GetHexVal(hex[i 

Подробнее здесь: [url]https://stackoverflow.com/questions/79125173/scardtransmit-returns-87-0x57-dont-know-whats-wrong-scardtransmit-works-wi[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»