From e64aa5b878dad3c9ac7a677960fbc2e9e540040b Mon Sep 17 00:00:00 2001 From: Christina Quast Date: Tue, 14 Apr 2015 15:07:33 +0200 Subject: [PATCH] apdu_split without C code remains --- usb_application/apdu_split.py | 78 ++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 33 deletions(-) mode change 100644 => 100755 usb_application/apdu_split.py diff --git a/usb_application/apdu_split.py b/usb_application/apdu_split.py old mode 100644 new mode 100755 index 5413d796..c0e08db4 --- a/usb_application/apdu_split.py +++ b/usb_application/apdu_split.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + # Code ported from simtrace host program apdu_split.c # # (C) 2010 by Harald Welte @@ -13,36 +15,24 @@ from enum import Enum -def Apdu_States(Enum): - APDU_S_CLA = 1 - APDU_S_INS = 2 - APDU_S_P1 = 3 - APDU_S_P2 = 4 - APDU_S_P3 = 5 - APDU_S_DATA = 6 - APDU_S_DATA_SINGLE = 7 - APDU_S_SW1 = 8 - APDU_S_SW2 = 9 - APDU_S_FIN = 10 +class Apdu_splitter: + APDU_S_CLA = 1 + APDU_S_INS = 2 + APDU_S_P1 = 3 + APDU_S_P2 = 4 + APDU_S_P3 = 5 + APDU_S_DATA = 6 + APDU_S_DATA_SINGLE = 7 + APDU_S_SW1 = 8 + APDU_S_SW2 = 9 + APDU_S_FIN = 10 -Apdu_S = { - APDU_S_CLA : func_APDU_S_CLA_P1_P2, - APDU_S_INS : func_APDU_S_INS, - APDU_S_P1 : func_APDU_S_CLA_P1_P2, - APDU_S_P2 : func_APDU_S_CLA_P1_P2, - APDU_S_P3 : func_APDU_S_P3, - APDU_S_DATA : func_APDU_S_DATA, - APDU_S_DATA_SINGLE : func_APDU_S_DATA_SINGLE, - APDU_S_SW1 : func_APDU_S_SW1, - APDU_S_SW2 : func_APDU_S_SW2 } - -class apdu_split: def __init__(self): - pass - # FIXME: init + self.state = APDU_S_CLA + self.buf = [] - def apdu_split_inbyte(self, c): + def split(self, c): Apdu_S[state](c) def func_APDU_S_INS(self, c): @@ -52,9 +42,9 @@ class apdu_split: self.buf.append(c) self.state += 1 - def func_func_APDU_S_P3(self, c): + def func_APDU_S_P3(self, c): self.buf.append(c) - data_remaining = 256 if c == 0 else c + self.data_remaining = 256 if c == 0 else c self.state = func_APDU_S_SW1 def func_APDU_S_DATA(self, c): @@ -69,23 +59,45 @@ class apdu_split: self.state = APDU_S_SW1 def func_APDU_S_SW1(self, c): - if (c == 0x60) { + if (c == 0x60): print("APDU_S_SW1: NULL") else: # check for 'all remaining' type ACK if c == self.ins or c == self.ins + 1 or c == ~(self.ins+1): print("ACK") - self.state = APDU_S_DATA) + self.state = APDU_S_DATA else: # check for 'only next byte' type ACK */ - if c == ~(as->apdu_ins): + if c == ~(self.ins): self.state = APDU_S_DATA_SINGLE else: # must be SW1 self.buf.append(c) self.state = func_APDU_S_SW2 - def func_APDU_S_SW2: + def func_APDU_S_SW2(self, c): self.buf.append(c) - print("APDU:", self.buf, self.apdu_len) + print("APDU:", self.buf) self.state = APDU_S_FIN + + Apdu_S = { + APDU_S_CLA : func_APDU_S_CLA_P1_P2, + APDU_S_INS : func_APDU_S_INS, + APDU_S_P1 : func_APDU_S_CLA_P1_P2, + APDU_S_P2 : func_APDU_S_CLA_P1_P2, + APDU_S_P3 : func_APDU_S_P3, + APDU_S_DATA : func_APDU_S_DATA, + APDU_S_DATA_SINGLE : func_APDU_S_DATA_SINGLE, + APDU_S_SW1 : func_APDU_S_SW1, + APDU_S_SW2 : func_APDU_S_SW2 } + + +if __name__ == '__main__': + msg = [0xA0, 0xA4, 0x00, 0x00, 0x02] + apdus = Apdu_splitter() + + for c in msg: + print(c) + apdus.split(c) + +