raw ccid communication with variable commands
diff --git a/usb_application/ccid_raw.py b/usb_application/ccid_raw.py
new file mode 100755
index 0000000..8df0dec
--- /dev/null
+++ b/usb_application/ccid_raw.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+
+from smartcard.scard import *
+import smartcard.util
+
+CMD_SEL_ROOT = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00]
+CMD_SEL_FILE = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x7F, 0x20]
+CMD_GET_DATA = [0xA0, 0xC0, 0x00, 0x00, 0x16]
+# SuperSIM ATR
+atr_supersim= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19]
+
+# Faster sysmocom SIM
+ATR_SYSMOCOM1 = [0x3B, 0x99, 0x18, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
+ATR_SYSMOCOM2 = [0x3B, 0x99, 0x11, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
+NEW_ATR = ATR_SYSMOCOM2
+
+def pattern_match(inpt):
+    if (inpt == ATR_SYSMOCOM1):
+        return NEW_ATR
+    elif (inpt == CMD_SEL_FILE):
+        return CMD_SEL_ROOT 
+    else:
+        return inpt        
+
+def connect_to_card(hcontext, reader):
+    hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader,
+        SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Unable to connect: ' +
+            SCardGetErrorMessage(hresult))
+    print 'Connected with active protocol', dwActiveProtocol
+    return hresult, hcard, dwActiveProtocol
+ 
+def establish_context(): 
+    hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Failed to establish context : ' +
+            SCardGetErrorMessage(hresult))
+    print 'Context established!'
+
+    hresult, readers = SCardListReaders(hcontext, [])
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Failed to list readers: ' +
+            SCardGetErrorMessage(hresult))
+    print 'PCSC Readers:', readers
+
+    if len(readers) < 1:
+        raise Exception('No smart card readers')
+
+    reader = readers[0]
+    print "Using reader:", reader
+    
+    return (hcontext, reader)
+
+
+def release_context(hcontext):
+    hresult = SCardReleaseContext(hcontext)
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Failed to release context: ' +
+                SCardGetErrorMessage(hresult))
+    print 'Released context.'
+
+def send_receive_cmd(cmd, hcard, dwActiveProtocol):
+    print("Response: ")
+    new_cmd = pattern_match(cmd)
+    print(' '.join([hex(i) for i in cmd]))
+    hresult, response = SCardTransmit(hcard, dwActiveProtocol,
+        new_cmd)
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Failed to transmit: ' +
+            SCardGetErrorMessage(hresult))
+    resp = pattern_match(response)
+    print 'Ans: ' + smartcard.util.toHexString(resp,
+        smartcard.util.HEX)
+    return response
+
+def disconnect_card(hcard):
+    hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD)
+    if hresult != SCARD_S_SUCCESS:
+        raise Exception('Failed to disconnect: ' +
+            SCardGetErrorMessage(hresult))
+    print 'Disconnected'
+
+
+def do_intercept(cmd, dwActiveProtocol):
+    send_receive_cmd(cmd, hcard, dwActiveProtocol)
+
+def init():
+    (hcontext, reader) = establish_context()
+    hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader)
+    return hcard, hcontext, dwActiveProtocol
+    
+def exit(hcard, hcontext):
+    disconnect_card(hcard)
+    release_context(hcontext)
+
+hcard, hcontext, dwActiveProtocol = init()
+
+do_intercept(CMD_SEL_ROOT, dwActiveProtocol)
+do_intercept(CMD_SEL_FILE, dwActiveProtocol)
+do_intercept(CMD_GET_DATA, dwActiveProtocol)
+
+exit(hcard, hcontext)