From 6e6dd7cfa7f22f59ca16d2d26a2def407b92cdb2 Mon Sep 17 00:00:00 2001 From: oepen Date: Mon, 25 Jul 2011 11:48:25 +0000 Subject: [PATCH] Preliminary extended length APDU support git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@429 96b47cad-a561-4643-ad3b-153ac7d7599c --- .../src/vpicc/virtualsmartcard/utils.py | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/utils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/utils.py index 1cd3083..ead1f2e 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/utils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/utils.py @@ -290,21 +290,34 @@ class C_APDU(APDU): apdu = apdu + [0] * max(4-len(apdu), 0) self.CLA, self.INS, self.P1, self.P2 = apdu[:4] # case 1, 2, 3, 4 - if len(apdu) == 5: # case 2 - self.Le = apdu[-1] + if len(apdu) == 4: # case 1 self.data = "" - elif len(apdu) > 5: # case 3, 4 - self.Lc = apdu[4] - if len(apdu) == 5 + self.Lc: # case 3 - self.data = apdu[5:] - elif len(apdu) == 5 + self.Lc + 1: # case 4 - self.data = apdu[5:-1] + elif (len(apdu) >= 7) and (apdu[5] == 0): # extended length apdu + self.Lc = (apdu[5]<<8) + apdu[6] + if len(apdu) == 7: # case 2 extended length + self.data = "" + elif len(apdu) == 7 + self.Lc: # case 3 extended length + self.data = apdu[7:] + elif len(apdu) == 7 + self.Lc + 3: # case 4 extended length + self.data = apdu[7:-3] + self.Le = (apdu[-2]<<8) + apdu[-1] + else: + raise ValueError, "Invalid Lc value. Is %s, should be %s or %s" % (self.Lc, + 7 + self.Lc, 7 + self.Lc + 3) + else: # short apdu + if len(apdu) == 5: # case 2 short apdu self.Le = apdu[-1] + self.data = "" + elif len(apdu) > 5: # case 3, 4 short apdu + self.Lc = apdu[4] + if len(apdu) == 5 + self.Lc: # case 3 + self.data = apdu[5:] + elif len(apdu) == 5 + self.Lc + 1: # case 4 + self.data = apdu[5:-1] + self.Le = apdu[-1] else: raise ValueError, "Invalid Lc value. Is %s, should be %s or %s" % (self.Lc, 5 + self.Lc, 5 + self.Lc + 1) - else: # case 1 - self.data = "" CLA = _make_byte_property("CLA"); cla = CLA INS = _make_byte_property("INS"); ins = INS