summaryrefslogtreecommitdiff
path: root/smcc/src/main/java/org/openecard/scio/osx/PCSC.java
diff options
context:
space:
mode:
Diffstat (limited to 'smcc/src/main/java/org/openecard/scio/osx/PCSC.java')
-rw-r--r--smcc/src/main/java/org/openecard/scio/osx/PCSC.java173
1 files changed, 173 insertions, 0 deletions
diff --git a/smcc/src/main/java/org/openecard/scio/osx/PCSC.java b/smcc/src/main/java/org/openecard/scio/osx/PCSC.java
new file mode 100644
index 00000000..1cdba441
--- /dev/null
+++ b/smcc/src/main/java/org/openecard/scio/osx/PCSC.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.openecard.scio.osx;
+
+/**
+ * Access to native PC/SC functions and definition of PC/SC constants.
+ * Initialization and platform specific PC/SC constants are handled in the
+ * platform specific superclass.
+ *
+ * @since 1.6
+ * @author Andreas Sterbenz
+ */
+final class PCSC extends PlatformPCSC {
+
+ private PCSC() {
+ // no instantiation
+ }
+
+ static void checkAvailable() throws RuntimeException {
+ if (INIT_EXCEPTION != null) {
+ throw new UnsupportedOperationException(
+ "PC/SC not available on this platform", INIT_EXCEPTION);
+ }
+ }
+
+ // returns SCARDCONTEXT (contextId)
+ static native long SCardEstablishContext(int scope) throws PCSCException;
+
+ static native String[] SCardListReaders(long contextId) throws PCSCException;
+
+ // returns SCARDHANDLE (cardId)
+ static native long SCardConnect(long contextId, String readerName,
+ int shareMode, int preferredProtocols) throws PCSCException;
+
+ static native byte[] SCardTransmit(long cardId, int protocol, byte[] buf,
+ int ofs, int len) throws PCSCException;
+
+ // returns the ATR of the card, updates status[] with reader state and
+ // protocol
+ static native byte[] SCardStatus(long cardId, byte[] status)
+ throws PCSCException;
+
+ static native void SCardDisconnect(long cardId, int disposition)
+ throws PCSCException;
+
+ // returns dwEventState[] of the same size and order as readerNames[]
+ static native int[] SCardGetStatusChange(long contextId, long timeout,
+ int[] currentState, String[] readerNames) throws PCSCException;
+
+ static native void SCardBeginTransaction(long cardId) throws PCSCException;
+
+ static native void SCardEndTransaction(long cardId, int disposition)
+ throws PCSCException;
+
+ static native byte[] SCardControl(long cardId, int controlCode,
+ byte[] sendBuffer) throws PCSCException;
+
+ // PCSC success/error/failure/warning codes
+ final static int SCARD_S_SUCCESS = 0x00000000;
+ final static int SCARD_E_CANCELLED = 0x80100002;
+ final static int SCARD_E_CANT_DISPOSE = 0x8010000E;
+ final static int SCARD_E_INSUFFICIENT_BUFFER = 0x80100008;
+ final static int SCARD_E_INVALID_ATR = 0x80100015;
+ final static int SCARD_E_INVALID_HANDLE = 0x80100003;
+ final static int SCARD_E_INVALID_PARAMETER = 0x80100004;
+ final static int SCARD_E_INVALID_TARGET = 0x80100005;
+ final static int SCARD_E_INVALID_VALUE = 0x80100011;
+ final static int SCARD_E_NO_MEMORY = 0x80100006;
+ final static int SCARD_F_COMM_ERROR = 0x80100013;
+ final static int SCARD_F_INTERNAL_ERROR = 0x80100001;
+ final static int SCARD_F_UNKNOWN_ERROR = 0x80100014;
+ final static int SCARD_F_WAITED_TOO_LONG = 0x80100007;
+ final static int SCARD_E_UNKNOWN_READER = 0x80100009;
+ final static int SCARD_E_TIMEOUT = 0x8010000A;
+ final static int SCARD_E_SHARING_VIOLATION = 0x8010000B;
+ final static int SCARD_E_NO_SMARTCARD = 0x8010000C;
+ final static int SCARD_E_UNKNOWN_CARD = 0x8010000D;
+ final static int SCARD_E_PROTO_MISMATCH = 0x8010000F;
+ final static int SCARD_E_NOT_READY = 0x80100010;
+ final static int SCARD_E_SYSTEM_CANCELLED = 0x80100012;
+ final static int SCARD_E_NOT_TRANSACTED = 0x80100016;
+ final static int SCARD_E_READER_UNAVAILABLE = 0x80100017;
+
+ final static int SCARD_W_UNSUPPORTED_CARD = 0x80100065;
+ final static int SCARD_W_UNRESPONSIVE_CARD = 0x80100066;
+ final static int SCARD_W_UNPOWERED_CARD = 0x80100067;
+ final static int SCARD_W_RESET_CARD = 0x80100068;
+ final static int SCARD_W_REMOVED_CARD = 0x80100069;
+ final static int SCARD_W_INSERTED_CARD = 0x8010006A;
+
+ final static int SCARD_E_UNSUPPORTED_FEATURE = 0x8010001F;
+ final static int SCARD_E_PCI_TOO_SMALL = 0x80100019;
+ final static int SCARD_E_READER_UNSUPPORTED = 0x8010001A;
+ final static int SCARD_E_DUPLICATE_READER = 0x8010001B;
+ final static int SCARD_E_CARD_UNSUPPORTED = 0x8010001C;
+ final static int SCARD_E_NO_SERVICE = 0x8010001D;
+ final static int SCARD_E_SERVICE_STOPPED = 0x8010001E;
+
+ // MS undocumented
+ final static int SCARD_E_NO_READERS_AVAILABLE = 0x8010002E;
+ // std. Windows invalid handle return code, used instead of SCARD code
+ final static int WINDOWS_ERROR_INVALID_HANDLE = 6;
+ final static int WINDOWS_ERROR_INVALID_PARAMETER = 87;
+
+ //
+ final static int SCARD_SCOPE_USER = 0x0000;
+ final static int SCARD_SCOPE_TERMINAL = 0x0001;
+ final static int SCARD_SCOPE_SYSTEM = 0x0002;
+ final static int SCARD_SCOPE_GLOBAL = 0x0003;
+
+ final static int SCARD_SHARE_EXCLUSIVE = 0x0001;
+ final static int SCARD_SHARE_SHARED = 0x0002;
+ final static int SCARD_SHARE_DIRECT = 0x0003;
+
+ final static int SCARD_LEAVE_CARD = 0x0000;
+ final static int SCARD_RESET_CARD = 0x0001;
+ final static int SCARD_UNPOWER_CARD = 0x0002;
+ final static int SCARD_EJECT_CARD = 0x0003;
+
+ final static int SCARD_STATE_UNAWARE = 0x0000;
+ final static int SCARD_STATE_IGNORE = 0x0001;
+ final static int SCARD_STATE_CHANGED = 0x0002;
+ final static int SCARD_STATE_UNKNOWN = 0x0004;
+ final static int SCARD_STATE_UNAVAILABLE = 0x0008;
+ final static int SCARD_STATE_EMPTY = 0x0010;
+ final static int SCARD_STATE_PRESENT = 0x0020;
+ final static int SCARD_STATE_ATRMATCH = 0x0040;
+ final static int SCARD_STATE_EXCLUSIVE = 0x0080;
+ final static int SCARD_STATE_INUSE = 0x0100;
+ final static int SCARD_STATE_MUTE = 0x0200;
+ final static int SCARD_STATE_UNPOWERED = 0x0400;
+
+ final static int TIMEOUT_INFINITE = 0xffffffff;
+
+ private final static char[] hexDigits = "0123456789abcdef".toCharArray();
+
+ public static String toString(byte[] b) {
+ StringBuffer sb = new StringBuffer(b.length * 3);
+ for (int i = 0; i < b.length; i++) {
+ int k = b[i] & 0xff;
+ if (i != 0) {
+ sb.append(':');
+ }
+ sb.append(hexDigits[k >>> 4]);
+ sb.append(hexDigits[k & 0xf]);
+ }
+ return sb.toString();
+ }
+
+}