summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/smartcard/test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
commita9bcc81f821d7c66f623779fa5147e728eb3c388 (patch)
tree98676963bcdd537ae5908a067a8eb110b93486a6 /winpr/libwinpr/smartcard/test
parentInitial commit. (diff)
downloadfreerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz
freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'winpr/libwinpr/smartcard/test')
-rw-r--r--winpr/libwinpr/smartcard/test/CMakeLists.txt26
-rw-r--r--winpr/libwinpr/smartcard/test/TestSmartCardListReaders.c53
-rw-r--r--winpr/libwinpr/smartcard/test/TestSmartCardStatus.c160
3 files changed, 239 insertions, 0 deletions
diff --git a/winpr/libwinpr/smartcard/test/CMakeLists.txt b/winpr/libwinpr/smartcard/test/CMakeLists.txt
new file mode 100644
index 0000000..4d8e107
--- /dev/null
+++ b/winpr/libwinpr/smartcard/test/CMakeLists.txt
@@ -0,0 +1,26 @@
+
+set(MODULE_NAME "TestSmartCard")
+set(MODULE_PREFIX "TEST_SMARTCARD")
+
+set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
+
+set(${MODULE_PREFIX}_TESTS
+ TestSmartCardListReaders.c)
+
+create_test_sourcelist(${MODULE_PREFIX}_SRCS
+ ${${MODULE_PREFIX}_DRIVER}
+ ${${MODULE_PREFIX}_TESTS})
+
+add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS})
+
+target_link_libraries(${MODULE_NAME} winpr)
+
+set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}")
+
+foreach(test ${${MODULE_PREFIX}_TESTS})
+ get_filename_component(TestName ${test} NAME_WE)
+ add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName})
+endforeach()
+
+set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test")
+
diff --git a/winpr/libwinpr/smartcard/test/TestSmartCardListReaders.c b/winpr/libwinpr/smartcard/test/TestSmartCardListReaders.c
new file mode 100644
index 0000000..637200b
--- /dev/null
+++ b/winpr/libwinpr/smartcard/test/TestSmartCardListReaders.c
@@ -0,0 +1,53 @@
+
+#include <winpr/crt.h>
+#include <winpr/smartcard.h>
+
+int TestSmartCardListReaders(int argc, char* argv[])
+{
+ LONG lStatus = 0;
+ LPSTR pReader = NULL;
+ SCARDCONTEXT hSC = 0;
+ LPSTR mszReaders = NULL;
+ DWORD cchReaders = SCARD_AUTOALLOCATE;
+
+ WINPR_UNUSED(argc);
+ WINPR_UNUSED(argv);
+
+ lStatus = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
+
+ if (lStatus != SCARD_S_SUCCESS)
+ {
+ printf("SCardEstablishContext failure: %s (0x%08" PRIX32 ")\n",
+ SCardGetErrorString(lStatus), lStatus);
+ return 0;
+ }
+
+ lStatus = SCardListReadersA(hSC, NULL, (LPSTR)&mszReaders, &cchReaders);
+
+ if (lStatus != SCARD_S_SUCCESS)
+ {
+ if (lStatus == SCARD_E_NO_READERS_AVAILABLE)
+ printf("SCARD_E_NO_READERS_AVAILABLE\n");
+ else
+ return -1;
+ }
+ else
+ {
+ pReader = mszReaders;
+
+ while (*pReader)
+ {
+ printf("Reader: %s\n", pReader);
+ pReader = pReader + strlen((CHAR*)pReader) + 1;
+ }
+
+ lStatus = SCardFreeMemory(hSC, mszReaders);
+
+ if (lStatus != SCARD_S_SUCCESS)
+ printf("Failed SCardFreeMemory\n");
+ }
+
+ SCardReleaseContext(hSC);
+
+ return 0;
+}
diff --git a/winpr/libwinpr/smartcard/test/TestSmartCardStatus.c b/winpr/libwinpr/smartcard/test/TestSmartCardStatus.c
new file mode 100644
index 0000000..011f0ce
--- /dev/null
+++ b/winpr/libwinpr/smartcard/test/TestSmartCardStatus.c
@@ -0,0 +1,160 @@
+// compile against PCSC gcc -o scardtest TestSmartCardStatus.c -DPCSC=1 -I /usr/include/PCSC
+// -lpcsclite
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined(__APPLE__) || defined(PCSC)
+#include <PCSC/winscard.h>
+#include <PCSC/wintypes.h>
+#elif defined(__linux__)
+#include <winpr/crt.h>
+#include <winpr/smartcard.h>
+#include <winpr/synch.h>
+#else
+#include <winscard.h>
+#endif
+
+#if defined(PCSC)
+int main(int argc, char* argv[])
+#else
+int TestSmartCardStatus(int argc, char* argv[])
+#endif
+{
+ SCARDCONTEXT hContext;
+ LPSTR mszReaders;
+ DWORD cchReaders = 0;
+ DWORD err;
+ SCARDHANDLE hCard;
+ DWORD dwActiveProtocol;
+ char name[100];
+ char* aname = NULL;
+ char* aatr = NULL;
+ DWORD len;
+ BYTE atr[32];
+ DWORD atrlen = 32;
+ DWORD status = 0;
+ DWORD protocol = 0;
+ err = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
+
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("ScardEstablishedContext: 0x%08x\n", err);
+ return -1;
+ }
+
+ err = SCardListReaders(hContext, "SCard$AllReaders", NULL, &cchReaders);
+
+ if (err != 0)
+ {
+ printf("ScardListReaders: 0x%08x\n", err);
+ return -1;
+ }
+
+ mszReaders = calloc(cchReaders, sizeof(char));
+
+ if (!mszReaders)
+ {
+ printf("calloc\n");
+ return -1;
+ }
+
+ err = SCardListReaders(hContext, "SCard$AllReaders", mszReaders, &cchReaders);
+
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("ScardListReaders: 0x%08x\n", err);
+ return -1;
+ }
+
+ printf("Reader: %s\n", mszReaders);
+ err = SCardConnect(hContext, mszReaders, SCARD_SHARE_SHARED,
+ SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
+
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("ScardConnect: 0x%08x\n", err);
+ return -1;
+ }
+
+ free(mszReaders);
+
+ printf("# test 1 - get reader length\n");
+ err = SCardStatus(hCard, NULL, &len, NULL, NULL, NULL, NULL);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("reader name length: %u\n", len);
+
+ printf("# test 2 - get reader name value\n");
+ err = SCardStatus(hCard, name, &len, NULL, NULL, NULL, NULL);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("Reader name: %s (%ld)\n", name, strlen(name));
+
+ printf("# test 3 - get all values - pre allocated\n");
+ err = SCardStatus(hCard, name, &len, &status, &protocol, atr, &atrlen);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("Reader name: %s (%ld/len %u)\n", name, strlen(name), len);
+ printf("status: 0x%08X\n", status);
+ printf("proto: 0x%08X\n", protocol);
+ printf("atrlen: %u\n", atrlen);
+
+ printf("# test 4 - get all values - auto allocate\n");
+ len = atrlen = SCARD_AUTOALLOCATE;
+ err = SCardStatus(hCard, (LPSTR)&aname, &len, &status, &protocol, (LPBYTE)&aatr, &atrlen);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("Reader name: %s (%ld/%u)\n", aname, strlen(aname), len);
+ printf("status: 0x%08X\n", status);
+ printf("proto: 0x%08X\n", protocol);
+ printf("atrlen: %u\n", atrlen);
+ SCardFreeMemory(hContext, aname);
+ SCardFreeMemory(hContext, aatr);
+
+ printf("# test 5 - get status and protocol only\n");
+ err = SCardStatus(hCard, NULL, NULL, &status, &protocol, NULL, NULL);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("status: 0x%08X\n", status);
+ printf("proto: 0x%08X\n", protocol);
+
+ printf("# test 6 - get atr only auto allocated\n");
+ atrlen = SCARD_AUTOALLOCATE;
+ err = SCardStatus(hCard, NULL, NULL, NULL, NULL, (LPBYTE)&aatr, &atrlen);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("atrlen: %u\n", atrlen);
+ SCardFreeMemory(hContext, aatr);
+
+ printf("# test 7 - get atr only pre allocated\n");
+ atrlen = 32;
+ err = SCardStatus(hCard, NULL, NULL, NULL, NULL, atr, &atrlen);
+ if (err != SCARD_S_SUCCESS)
+ {
+ printf("SCardStatus: 0x%08x\n", err);
+ return -1;
+ }
+ printf("atrlen: %u\n", atrlen);
+ SCardDisconnect(hCard, SCARD_LEAVE_CARD);
+ SCardReleaseContext(hContext);
+
+ return 0;
+}