189 lines · 7.7 KB · Java
RawDownload
/* * 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 sun.security.smartcardio; import java.security.AccessController; import sun.security.action.LoadLibraryAction; /** * 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 (initException != null) {            throw new UnsupportedOperationException                    ("PC/SC not available on this platform", initException);        }    }     // 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();    } }