From 890c3c0d321c3b59ec1224d4630b3f2401ef94e7 Mon Sep 17 00:00:00 2001 From: tkellner Date: Tue, 7 Jan 2014 17:28:54 +0000 Subject: Add custom PC/SC library for MacOS X from OpeneCard project git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@1276 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../src/main/java/org/openecard/scio/osx/PCSC.java | 173 +++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 smcc/src/main/java/org/openecard/scio/osx/PCSC.java (limited to 'smcc/src/main/java/org/openecard/scio/osx/PCSC.java') 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(); + } + +} -- cgit v1.2.3