blob: 47d947acf4f3b7d104be3d45009e52fcbcbfd793 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.security.smartcardio;
27
28import java.io.File;
29import java.io.IOException;
30
31import java.security.AccessController;
32import java.security.PrivilegedAction;
33
34import sun.security.util.Debug;
35
36/**
37 * Platform specific code and functions for Unix / MUSCLE based PC/SC
38 * implementations.
39 *
40 * @since 1.6
41 * @author Andreas Sterbenz
42 */
43class PlatformPCSC {
44
45 static final Debug debug = Debug.getInstance("pcsc");
46
47 static final Throwable initException;
48
49 private final static String PROP_NAME = "sun.security.smartcardio.library";
50
51 private final static String LIB1 = "/usr/$LIBISA/libpcsclite.so";
52 private final static String LIB2 = "/usr/local/$LIBISA/libpcsclite.so";
53
54 PlatformPCSC() {
55 // empty
56 }
57
58 static {
59 initException = AccessController.doPrivileged(new PrivilegedAction<Throwable>() {
60 public Throwable run() {
61 try {
62 System.loadLibrary("j2pcsc");
63 String library = getLibraryName();
64 if (debug != null) {
65 debug.println("Using PC/SC library: " + library);
66 }
67 initialize(library);
68 return null;
69 } catch (Throwable e) {
70 return e;
71 }
72 }
73 });
74 }
75
76 // expand $LIBISA to the system specific directory name for libraries
77 private static String expand(String lib) {
78 int k = lib.indexOf("$LIBISA");
79 if (k == -1) {
80 return lib;
81 }
82 String s1 = lib.substring(0, k);
83 String s2 = lib.substring(k + 7);
84 String libDir;
85 if ("64".equals(System.getProperty("sun.arch.data.model"))) {
86 if ("SunOS".equals(System.getProperty("os.name"))) {
87 libDir = "lib/64";
88 } else {
89 // assume Linux convention
90 libDir = "lib64";
91 }
92 } else {
93 // must be 32-bit
94 libDir = "lib";
95 }
96 String s = s1 + libDir + s2;
97 return s;
98 }
99
100 private static String getLibraryName() throws IOException {
101 // if system property is set, use that library
102 String lib = expand(System.getProperty(PROP_NAME, "").trim());
103 if (lib.length() != 0) {
104 return lib;
105 }
106 lib = expand(LIB1);
107 if (new File(lib).isFile()) {
108 // if LIB1 exists, use that
109 return lib;
110 }
111 lib = expand(LIB2);
112 if (new File(lib).isFile()) {
113 // if LIB2 exists, use that
114 return lib;
115 }
116 throw new IOException("No PC/SC library found on this system");
117 }
118
119 private static native void initialize(String libraryName);
120
121 // PCSC constants defined differently under Windows and MUSCLE
122 // MUSCLE version
123 final static int SCARD_PROTOCOL_T0 = 0x0001;
124 final static int SCARD_PROTOCOL_T1 = 0x0002;
125 final static int SCARD_PROTOCOL_RAW = 0x0004;
126
127 final static int SCARD_UNKNOWN = 0x0001;
128 final static int SCARD_ABSENT = 0x0002;
129 final static int SCARD_PRESENT = 0x0004;
130 final static int SCARD_SWALLOWED = 0x0008;
131 final static int SCARD_POWERED = 0x0010;
132 final static int SCARD_NEGOTIABLE = 0x0020;
133 final static int SCARD_SPECIFIC = 0x0040;
134
135}