9 Replies Latest reply: Jun 13, 2014 11:30 AM by yonran
V@lentino Level 1 Level 1 (0 points)

Hi,

 

I have applet that uses javax.smartcardio package to comunicate with smart card! It works on all Windows, Linux and versions before Mac OS X Lion!

But in OS X ML the applet crashes. There is no 32 bit Java 7 to test with it. I don't know if the problem is PCSC library or this reported bug.

Since Java 7 is embeded in browser plugin if I remove it, my applets are not started at all, and I can not use Java 6.

What should I do?

 

At Thread 45 I see "libj2pcsc.dylib". Is this the pcsc library used by Java to connect to Smard Card readers?

 

The error mesage starts with :

 

Process: java [275]
Path: /usr/bin/java
Identifier:      net.java.openjdk.cmd
Version:         1.0 (1.0)
Code Type:       X86-64 (Native)
Parent Process:  firefox [250]
User ID:         501

PlugIn Path:       /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/server/libjvm.dylib
PlugIn Identifier: libjvm.dylib
PlugIn Version:    ??? (1)

Date/Time:       2013-02-22 14:42:21.668 +0200
OS Version:      Mac OS X 10.8.2 (12C3103)
Report Version:  10

Interval Since Last Report:          578 sec
Crashes Since Last Report:           3
Per-App Interval Since Last Report:  81 sec
Per-App Crashes Since Last Report:   3
Anonymous UUID: 96EB679A-6347-0DC9-8DD0-92120850DE45

Crashed Thread:  45  Java: Thread-20

Exception Type:  EXC_BAD_ACCESS (SIGABRT)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000

VM Regions Near 0:
-->
  __TEXT 00000001075fd000-000000010760e000 [   68K] r-x/rwx SM=COW /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java

Application Specific Information:
abort() called

Thread 0:: AppKit Thread  Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib 0x00007fff90f3d686 mach_msg_trap + 10
1   libsystem_kernel.dylib 0x00007fff90f3cc42 mach_msg + 70
2   com.apple.CoreFoundation 0x00007fff8e360803 __CFRunLoopServiceMachPort + 195
3   com.apple.CoreFoundation 0x00007fff8e365ee6 __CFRunLoopRun + 1078
4   com.apple.CoreFoundation 0x00007fff8e3656b2 CFRunLoopRunSpecific + 290
5 com.apple.HIToolbox 0x00007fff87dd10a4 RunCurrentEventLoopInMode + 209
6 com.apple.HIToolbox 0x00007fff87dd0e42 ReceiveNextEventCommon + 356
7 com.apple.HIToolbox 0x00007fff87dd0cd3 BlockUntilNextEventMatchingListInMode + 62
8 com.apple.AppKit 0x00007fff8eb94613 _DPSNextEvent + 685
9 com.apple.AppKit 0x00007fff8eb93ed2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
10  libosxapp.dylib 0x00000001657c1b56 -[NSApplicationAWT nextEventMatchingMask:untilDate:inMode:dequeue:] + 124
11 com.apple.AppKit 0x00007fff8eb8b283 -[NSApplication run] + 517
12 libosxapp.dylib 0x00000001657c19b9 +[NSApplicationAWT runAWTLoopWithApp:] + 156
13 liblwawt.dylib 0x000000016571b81a -[AWTStarter starter:] + 1591
14 com.apple.Foundation 0x00007fff89b57677 __NSThreadPerformPerform + 225
15  com.apple.CoreFoundation 0x00007fff8e343101 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
16  com.apple.CoreFoundation 0x00007fff8e342a25 __CFRunLoopDoSources0 + 245
17  com.apple.CoreFoundation 0x00007fff8e365dc5 __CFRunLoopRun + 789
18  com.apple.CoreFoundation 0x00007fff8e3656b2 CFRunLoopRunSpecific + 290
19 java 0x000000010760442d CreateExecutionEnvironment + 871
20 java 0x00000001075febdc JLI_Launch + 1952
21  java 0x000000010760478a main + 101
22 java 0x00000001075fe434 start + 52
....


Thread 45 Crashed:: Java: Thread-20

0   libsystem_kernel.dylib            0x00007fff90f3f212 __pthread_kill + 10

1   libsystem_c.dylib                 0x00007fff9092baf4 pthread_kill + 90

2   libsystem_c.dylib                 0x00007fff9096fdce abort + 143

3   libjvm.dylib                      0x0000000107adbc6f os::abort(bool) + 25

4   libjvm.dylib                      0x0000000107bca42e VMError::report_and_die() + 2306

5   libjvm.dylib                      0x0000000107add363 JVM_handle_bsd_signal + 1073

6   libsystem_c.dylib                 0x00007fff909188ea _sigtramp + 26

7   libj2pcsc.dylib                   0x0000000164a7066e pcsc_multi2jstring + 17

8   libj2pcsc.dylib                   0x0000000164a707f9 Java_sun_security_smartcardio_PCSC_SCardListReaders + 114

9   ???                               0x00000001083b5f90 0 + 4433076112

10  ???                               0x00000001083aa333 0 + 4433027891

11  ???                               0x00000001083aa450 0 + 4433028176

12  ???                               0x00000001083aa450 0 + 4433028176

13  ???                               0x00000001083aa333 0 + 4433027891

14  ???                               0x00000001083aa158 0 + 4433027416

15  ???                               0x00000001083aa450 0 + 4433028176

16  ???                               0x00000001083aa333 0 + 4433027891

17  ???                               0x00000001083aa333 0 + 4433027891

18  ???                               0x00000001083aa806 0 + 4433029126

19  ???                               0x00000001083a44f7 0 + 4433003767

20  libjvm.dylib                      0x00000001079af52f JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) + 557

21  libjvm.dylib                      0x00000001079afa0c JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) + 256

22  libjvm.dylib                      0x00000001079afb46 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) + 74

23  libjvm.dylib                      0x00000001079e64c0 thread_entry(JavaThread*, Thread*) + 169

24  libjvm.dylib                      0x0000000107b9f294 JavaThread::thread_main_inner() + 134

25  libjvm.dylib                      0x0000000107ba077a JavaThread::run() + 440

26  libjvm.dylib                      0x0000000107adc191 java_start(Thread*) + 173

27  libsystem_c.dylib                 0x00007fff9092a742 _pthread_start + 327

28  libsystem_c.dylib                 0x00007fff90917181 thread_start + 13


Thank you

Best Regards

Valentin Ivanov


MacBook Air, OS X Mountain Lion (10.8.2)
  • yonran Level 1 Level 1 (0 points)

    Hi. Yes, it is the same as the bug you linked.

     

    Solution: replace libj2pcsc.dylib[1] with a fixed library. You can download the one I made here[3], if you trust some random person on the Internet.

     

    Details: I filed a more descriptive bug two months ago but Oracle never acknowledged it. The bug is that Oracle's 64-bit PCSC native library[1] is broken. They included a header file that typedef's DWORD to a 64-bit value, when the PCSC OS X library actually gives you a 32-bit value. The fix is to replace winscard.h[2] with a header that simply #include <PCSC/wincard.h>, #include <PCSC/wintypes.h> and then run the openjdkathome compile. Then replace your JDK7 copy of the library with the fixed one.

     

    Yonathan Randolph

    www.github.com/yonran

     

    [1]: /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/libj2pc sc.dylib

    [2]: OpenJDK: jdk/src/solaris/native/sun/security/smartcardio/MUSCLE/winscard.h

    [3]: http://dl.dropbox.com/u/17967820/libj2pcsc.dylib

  • V@lentino Level 1 Level 1 (0 points)

    Hi Yonathan Randolph,

     

    I have tried your fixed library but nothing happens at all. The problem still remains.

    By the way in Mac OS X ML we have no path as /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/libj2pc sc.dylib. We have libj2pcsc.dylib in /Library/Internet Plug-Ins/JavaAppletPlugin.plugin 1/Contents/Home/lib, since Java 7 is embeded in browser plugin for OS X ML. We have no installed jDK at all. This is client pc.

    I would like to ask you for link to the bug you have posted to Oracle.

     

    Thank you

    Best Regards, Valentin Ivanov

  • thomas_r. Level 7 Level 7 (30,540 points)

    Since Java 7 is embeded in browser plugin if I remove it, my applets are not started at all

     

    I cannot address your question, but you should be aware that using Java in the browser is extremely dangerous at this time, and shows no signs of ever becoming safe. See:

     

    Java is vulnerable… Again?!

     

    and:

     

    http://java-0day.com

     

    You should really start finding ways to replace Java in your web browser with other things.

  • yonran Level 1 Level 1 (0 points)

    Valentin Ivanov, I’m sorry, but I can’t link to the bug I filed because they never approved it (there’s some kind of moderation before giving bugs a bug id). I can only tell you that it was internal review ID 2396490.

     

    But after successfully compiling OpenJDK with the fix, I sent a message to security-dev@openjdk.java.net.

     

    Yonathan Randolph

  • Krivens Level 1 Level 1 (0 points)

    Any news?

     

    I wrote an Applet that uses javax.smartcardio on Windows and all worked OK.  On the Mac -- No dice.

     

    I'm not sure I'm having the same problem -- but it does seem like it to me.  Kind of frustrating that it works in Windows land -- but not on the Mac.

  • alex.suzuki Level 1 Level 1 (5 points)

    I can confirm the issue here (Mountain Lion, 10.8.5). A very simple program (attached below) that just enumerates terminals and checks if a card is present will crash:

     

    • If Apple JDK6 is used in 64-bit mode (without supplying the -d32 argument)
    • If Oracle JDK7 is used (can not switch to 64-bit, uses)

     

    It will work if:

     

    • If Apple JDK6 is forced into 32-bit mode using -d32
    • If Oracle JDK7 version of libj2pcsc.dylib is replaced with a patched version

     

    javax.smartcardio on Mac OS X is in a truly sad state. :-(

    Can anyone suggest alternatives for Smartcard communication on Mac OS X fat clients?

     

     

     

     

    package com.example.smartcardio;

     

    import javax.smartcardio.CardTerminal;

    import javax.smartcardio.CardTerminals;

    import javax.smartcardio.TerminalFactory;

     

    public class TestWaitForChanges {

              public static void main(String[] args) throws Exception {

                        CardTerminals terminals = TerminalFactory.getDefault().terminals();

                        while (true) {

                                  for (CardTerminal terminal : terminals.list()) {

                                            System.out.println("Checking terminal: " + terminal.getName());

                                            System.out.println("Card present: " + (terminal.isCardPresent() ? "YES" : "NO"));

                                  }

     

     

                                  System.out.println("Waiting for changes...");

                                  terminals.waitForChange();

                        }

              }

    }

  • yonran Level 1 Level 1 (0 points)

    alex.suzuki, are you able to use JNI or JNA? If so, you can talk to the smartcard native library directly. I posted a proof-of-concept smartcardio library callled jna2pcsc, although it is neither finished, nor well-tested as it was not needed at my company.

  • alex.suzuki Level 1 Level 1 (5 points)

    Yonathan, yes, I should be able to use JNI and JNA (latter is preferred as we wouldn't have to extend our build system to deal with platform-specific native code). Your library looks very interesting. I'll try if it works for my usecase, and get back to you. Thanks a lot!

  • yonran Level 1 Level 1 (0 points)

    In May 2014, Oracles’s Ivan Gerasimov fixed waitForChange and supposedly fixed list and isCardPresent as of JRE 7u80, 8u20, and 9. The latter commit is pretty suspicious, so I advise you to test it extensively before declaring the issue fixed. If anyone wants to recompile OpenJDK you can test out the changes yourself.