Removed vim folding markers
git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@526 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
MAX_SHORT_LE = 0xff
|
||||
MAX_EXTENDED_LE = 0xffff
|
||||
|
||||
# Life cycle status byte {{{
|
||||
# Life cycle status byte
|
||||
LCB = {}
|
||||
LCB["NOINFORMATION"] = 0x00
|
||||
LCB["CREATION"] = 0x01
|
||||
@@ -27,15 +27,15 @@ LCB["INITIALISATION"] = 0x03
|
||||
LCB["ACTIVATED"] = 0x05
|
||||
LCB["DEACTIVATED"] = 0x04
|
||||
LCB["TERMINATION"] = 0x0C
|
||||
# }}}
|
||||
# Channel security attribute {{{
|
||||
|
||||
# Channel security attribute
|
||||
CS = {}
|
||||
CS["NOTSHAREABLE"] = 0x01
|
||||
CS["SECURED"] = 0x02
|
||||
CS["USERAUTHENTICATED"] = 0x03
|
||||
# }}}
|
||||
# Security attribute {{{
|
||||
# Security attribute, Access mode byte for DFs/EFs {{{
|
||||
|
||||
# Security attribute
|
||||
# Security attribute, Access mode byte for DFs/EFs
|
||||
SA = {}
|
||||
SA["AM_DF_DELETESELF"] = SA["AM_EF_DELETEFILE"] = 0x40
|
||||
SA["AM_DF_TERMINATEDF"] = SA["AM_EF_TERMINATEFILE"] = 0x20
|
||||
@@ -44,8 +44,8 @@ SA["AM_DF_DEACTIVATEFILE"] = SA["AM_EF_DEACTIVATEFILE"] = 0x08
|
||||
SA["AM_DF_CREATEDF"] = SA["AM_EF_WRITEBINARY"] = 0x04
|
||||
SA["AM_DF_CREATEEF"] = SA["AM_EF_UPDATEBINARY"] = 0x02
|
||||
SA["AM_DF_DELETECHILD"] = SA["AM_EF_READBINARY"] = 0x01
|
||||
# }}}
|
||||
# Security attribute in compact format, Security condition byte {{{
|
||||
|
||||
# Security attribute in compact format, Security condition byte
|
||||
SA["CF_SC_NOCONDITION"] = 0x00
|
||||
SA["CF_SC_NEVER"] = 0xFF
|
||||
SA["__CF_SC_ATLEASTONE"] = 0x80
|
||||
@@ -59,9 +59,9 @@ SA["CF_SC_ONE_USERAUTHENTICATION"] = SA["__CF_SC_ATLEASTONE"]|SA["__CF_SC_US
|
||||
SA["CF_SC_ALL_SECUREMESSAGING"] = SA["__CF_SC_ALLCONDITIONS"]|SA["__CF_SC_SECUREMESSAGING"]
|
||||
SA["CF_SC_ALL_EXTERNALAUTHENTICATION"] = SA["__CF_SC_ALLCONDITIONS"]|SA["__CF_SC_EXTERNALAUTHENTICATION"]
|
||||
SA["CF_SC_ALL_USERAUTHENTICATION"] = SA["__CF_SC_ALLCONDITIONS"]|SA["__CF_SC_USERAUTHENTICATION"]
|
||||
# }}}
|
||||
# }}}
|
||||
# Data coding byte {{{
|
||||
|
||||
|
||||
# Data coding byte
|
||||
DCB = {}
|
||||
DCB["ONETIMEWRITE"] = 0x00
|
||||
DCB["PROPRIETARY"] = 0x20 # we use it for XOR
|
||||
@@ -69,8 +69,8 @@ DCB["WRITEOR"] = 0x40
|
||||
DCB["WRITEAND"] = 0x60
|
||||
DCB["BERTLV_FFVALID"] = 0x10
|
||||
DCB["BERTLV_FFINVALID"] = 0x10
|
||||
# }}}
|
||||
# File descriptor byte {{{
|
||||
|
||||
# File descriptor byte
|
||||
FDB = {}
|
||||
FDB["NOTSHAREABLEFILE"] = 0x00
|
||||
FDB["SHAREABLEFILE"] = 0x40
|
||||
@@ -85,18 +85,17 @@ FDB["EFSTRUCTURE_LINEAR_VARIABLE_NOFURTHERINFO"] = 0x04
|
||||
FDB["EFSTRUCTURE_LINEAR_VARIABLESIMPLETLV"] = 0x05
|
||||
FDB["EFSTRUCTURE_CYCLIC_NOFURTHERINFO"] = 0x06
|
||||
FDB["EFSTRUCTURE_CYCLIC_SIMPLETLV"] = 0x07
|
||||
# }}}
|
||||
# File identifier {{{
|
||||
|
||||
# File identifier
|
||||
FID = {}
|
||||
FID["EFDIR"] = 0x2F00
|
||||
FID["EFATR"] = 0x2F00
|
||||
FID["MF"] = 0x3F00
|
||||
FID["PATHSELECTION"] = 0x3FFF
|
||||
FID["RESERVED"] = 0x3FFF
|
||||
# }}}
|
||||
|
||||
|
||||
#Secure Messaging constants
|
||||
#{{{
|
||||
SM_Class = {}
|
||||
|
||||
#Basic secure messaging objects
|
||||
@@ -213,7 +212,7 @@ ALGO_MAPPING[0x0B] = "CC"
|
||||
ALGO_MAPPING[0x0C] = "RSA"
|
||||
ALGO_MAPPING[0x0D] = "DSA"
|
||||
|
||||
# Recerence control for select command, and record handling commands {{{
|
||||
# Recerence control for select command, and record handling commands
|
||||
REF = {
|
||||
"IDENTIFIER_FIRST" : 0x00,
|
||||
"IDENTIFIER_LAST" : 0x01,
|
||||
@@ -226,4 +225,4 @@ REF = {
|
||||
"NUMBER_CONTROL" : 0x07,
|
||||
"REFERENCE_CONTROL" : 0x07,
|
||||
}
|
||||
# }}}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# virtualsmartcard. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Meaning of the interindustry values of SW1-SW2 {{{
|
||||
# Meaning of the interindustry values of SW1-SW2
|
||||
SW = {
|
||||
"NORMAL" : 0x9000,
|
||||
"NORMAL_REST" : 0x6100,
|
||||
@@ -125,7 +125,6 @@ for i in range(0, 0xff):
|
||||
SW_MESSAGES[0x6600 + i] = 'Execution error (Security-related issues)'
|
||||
SW_MESSAGES[0x6C00 + i] = 'Checking error (Wrong Le field; %d available data bytes)' % i
|
||||
|
||||
# }}}
|
||||
|
||||
class SwError(Exception):
|
||||
def __init__(self, sw):
|
||||
|
||||
@@ -27,7 +27,7 @@ from virtualsmartcard.TLVutils import *
|
||||
from virtualsmartcard.SWutils import SW, SwError
|
||||
from virtualsmartcard.utils import stringtoint, inttostring
|
||||
|
||||
def isEqual(list): # {{{
|
||||
def isEqual(list):
|
||||
"""Returns True, if all items are equal, otherwise False"""
|
||||
if len(list) > 1:
|
||||
for item in list:
|
||||
@@ -35,9 +35,9 @@ def isEqual(list): # {{{
|
||||
return False
|
||||
|
||||
return True
|
||||
# }}}
|
||||
|
||||
def walk(start, path): # {{{
|
||||
|
||||
def walk(start, path):
|
||||
"""Walks a path of fids and returns the last file (EF or DF).
|
||||
|
||||
start -- DF, where to look for the first fid
|
||||
@@ -54,9 +54,9 @@ def walk(start, path): # {{{
|
||||
index = index + 2
|
||||
|
||||
return start
|
||||
# }}}
|
||||
|
||||
def getfile_byrefdataobj(mf, refdataobjs): # {{{
|
||||
|
||||
def getfile_byrefdataobj(mf, refdataobjs):
|
||||
"""Returns a list of files according to the given list of reference data
|
||||
objects.
|
||||
|
||||
@@ -97,9 +97,9 @@ def getfile_byrefdataobj(mf, refdataobjs): # {{{
|
||||
result.append(file)
|
||||
|
||||
return result
|
||||
# }}}
|
||||
|
||||
def write(old, newlist, offsets, datacoding, maxsize=None): # {{{
|
||||
|
||||
def write(old, newlist, offsets, datacoding, maxsize=None):
|
||||
"""Returns the status bytes and the result of a write operation according to
|
||||
the given data coding.
|
||||
|
||||
@@ -153,9 +153,9 @@ def write(old, newlist, offsets, datacoding, maxsize=None): # {{{
|
||||
listindex = listindex + 1
|
||||
|
||||
return result
|
||||
# }}}
|
||||
|
||||
def get_indexes(items, reference=REF["IDENTIFIER_FIRST"], index_current=0): # {{{
|
||||
|
||||
def get_indexes(items, reference=REF["IDENTIFIER_FIRST"], index_current=0):
|
||||
"""
|
||||
Returns all indexes of the list, which are specified by 'reference' and by
|
||||
the current index 'index_current' (-1 for no current item) in the correct
|
||||
@@ -186,9 +186,9 @@ def get_indexes(items, reference=REF["IDENTIFIER_FIRST"], index_current=0): # {{
|
||||
# Read next occurrence
|
||||
indexes = range(index_current + 1, len(items))
|
||||
return indexes
|
||||
# }}}
|
||||
|
||||
def prettyprint_anything(indent, thing): # {{{
|
||||
|
||||
def prettyprint_anything(indent, thing):
|
||||
"""
|
||||
Returns a recursively generated string representation of an object and its
|
||||
attributes.
|
||||
@@ -205,9 +205,9 @@ def prettyprint_anything(indent, thing): # {{{
|
||||
for item in newvalue:
|
||||
s = s + "\n" + prettyprint_anything(indent + " ", item)
|
||||
return s
|
||||
# }}}
|
||||
|
||||
def make_property(prop, doc): # {{{
|
||||
|
||||
def make_property(prop, doc):
|
||||
"""
|
||||
Assigns a property to the calling object. This is used to decorate instance
|
||||
variables with docstrings.
|
||||
@@ -217,7 +217,7 @@ def make_property(prop, doc): # {{{
|
||||
lambda self, value: setattr(self, "_"+prop, value),
|
||||
lambda self: delattr(self, "_"+prop),
|
||||
doc)
|
||||
# }}}
|
||||
|
||||
|
||||
|
||||
class File(object):
|
||||
@@ -390,10 +390,10 @@ class File(object):
|
||||
def select(self, *argz, **args):
|
||||
"""Only a template, will raise an error."""
|
||||
raise SwError(SW["ERR_INCOMPATIBLEWITHFILE"])
|
||||
# }}}
|
||||
|
||||
|
||||
class DF(File): # {{{
|
||||
|
||||
class DF(File):
|
||||
"""Class for a dedicated file"""
|
||||
data = make_property("data", "unknown")
|
||||
content = make_property("content", "list of files of the DF")
|
||||
@@ -490,10 +490,10 @@ class DF(File): # {{{
|
||||
def remove(self, file):
|
||||
"""Removes 'file' from the content of the DF"""
|
||||
self.content.remove(file)
|
||||
# }}}
|
||||
|
||||
|
||||
class MF(DF): # {{{
|
||||
|
||||
class MF(DF):
|
||||
"""Class for a master file"""
|
||||
current = make_property("current", "the currently selected file")
|
||||
firstSFT = make_property("firstSFT", "string of length 1. The first software function table from the historical bytes.")
|
||||
@@ -513,7 +513,7 @@ class MF(DF): # {{{
|
||||
|
||||
|
||||
@staticmethod
|
||||
def makeFirstSoftwareFunctionTable(# {{{
|
||||
def makeFirstSoftwareFunctionTable(
|
||||
DFSelectionByFullDFName=True, DFSelectionByPartialDFName=True,
|
||||
DFSelectionByPath=True, DFSelectionByFID=True,
|
||||
DFSelectionByApplication_implicite=True, ShortFIDSupported=True,
|
||||
@@ -549,16 +549,16 @@ class MF(DF): # {{{
|
||||
if RecordIdentifierSupported:
|
||||
fsft |= 1
|
||||
return fsft
|
||||
# }}}
|
||||
|
||||
|
||||
@staticmethod
|
||||
def makeSecondSoftwareFunctionTable(DCB=DCB["ONETIMEWRITE"]|1): # {{{
|
||||
def makeSecondSoftwareFunctionTable(DCB=DCB["ONETIMEWRITE"]|1):
|
||||
"""
|
||||
The second software function table from the historical bytes contains
|
||||
the data coding byte.
|
||||
"""
|
||||
return DCB
|
||||
# }}}
|
||||
|
||||
|
||||
def currentDF(self):
|
||||
"""Returns the current DF."""
|
||||
@@ -1295,10 +1295,10 @@ class MF(DF): # {{{
|
||||
# FIXME: free memory of file and remove its content from the security device
|
||||
|
||||
return SW["NORMAL"], ""
|
||||
# }}}
|
||||
|
||||
|
||||
class EF(File): # {{{
|
||||
|
||||
class EF(File):
|
||||
"""Template class for an elementary file."""
|
||||
shortfid = make_property("shortfid", "integer with 1<=shortfid<=30. Short EF identifier.")
|
||||
datacoding = make_property("datacoding", "integer. Data coding byte.")
|
||||
@@ -1323,10 +1323,10 @@ class EF(File): # {{{
|
||||
simpletlv_data,
|
||||
bertlv_data)
|
||||
self.datacoding = datacoding
|
||||
# }}}
|
||||
|
||||
|
||||
class TransparentStructureEF(EF): # {{{
|
||||
|
||||
class TransparentStructureEF(EF):
|
||||
"""Class for an elementary file with transparent structure."""
|
||||
data = make_property("data", "string (encrypted). The file's data.")
|
||||
def __init__(self, parent, fid, filedescriptor=FDB["EFSTRUCTURE_TRANSPARENT"],
|
||||
@@ -1391,10 +1391,10 @@ class TransparentStructureEF(EF): # {{{
|
||||
|
||||
data = data[0:erasefrom] + data[eraseto:len(data)]
|
||||
self.setdec('data', data)
|
||||
# }}}
|
||||
|
||||
|
||||
class Record(object): # {{{
|
||||
|
||||
class Record(object):
|
||||
data = make_property("data", "string. The record's data.")
|
||||
identifier = make_property("identifier", "integer with 1<= identifier< = 0xfe. The record's identifier.")
|
||||
"""Class for a Record of an elementary of record structure"""
|
||||
@@ -1412,10 +1412,10 @@ class Record(object): # {{{
|
||||
"""Returns a string of the object using an prettyprint_anything."""
|
||||
return prettyprint_anything("", self)
|
||||
__repr__ = __str__
|
||||
# }}}
|
||||
|
||||
|
||||
class RecordStructureEF(EF): # {{{
|
||||
|
||||
class RecordStructureEF(EF):
|
||||
"""Class for an elementary file with record structure."""
|
||||
records = make_property("records", "list of records (encrypted)")
|
||||
maxrecordsize = make_property("maxrecordsize", "integer. maximum length of a record's data.")
|
||||
@@ -1630,4 +1630,4 @@ class RecordStructureEF(EF): # {{{
|
||||
r.data = ""
|
||||
r.identifier = None
|
||||
return SW["NORMAL"]
|
||||
# }}}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ TAG["TAG_LIST"] = 0x5C
|
||||
TAG["HEADER_LIST"] = 0x5D
|
||||
TAG["EXTENDED_HEADER_LIST"] = 0x4D
|
||||
|
||||
def tlv_unpack(data): # {{{
|
||||
def tlv_unpack(data):
|
||||
ber_class = (ord(data[0]) & 0xC0) >> 6
|
||||
constructed = (ord(data[0]) & 0x20) != 0 ## 0 = primitive, 0x20 = constructed
|
||||
tag = ord(data[0])
|
||||
@@ -76,9 +76,9 @@ def tlv_unpack(data): # {{{
|
||||
rest = data[length:]
|
||||
|
||||
return ber_class, constructed, tag, length, value, rest
|
||||
# }}}
|
||||
|
||||
def tlv_find_tags(tlv_data, tags, num_results = None): # {{{
|
||||
|
||||
def tlv_find_tags(tlv_data, tags, num_results = None):
|
||||
"""Find (and return) all instances of tags in the given tlv structure (as
|
||||
returned by unpack). If num_results is specified then at most that many
|
||||
results will be returned."""
|
||||
@@ -99,16 +99,16 @@ def tlv_find_tags(tlv_data, tags, num_results = None): # {{{
|
||||
find_recursive(tlv_data)
|
||||
|
||||
return results
|
||||
# }}}
|
||||
|
||||
def tlv_find_tag(tlv_data, tag, num_results = None): # {{{
|
||||
|
||||
def tlv_find_tag(tlv_data, tag, num_results = None):
|
||||
"""Find (and return) all instances of tag in the given tlv structure (as returned by unpack).
|
||||
If num_results is specified then at most that many results will be returned."""
|
||||
|
||||
return tlv_find_tags(tlv_data, [tag], num_results)
|
||||
# }}}
|
||||
|
||||
def pack(tlv_data, recalculate_length = False): # {{{
|
||||
|
||||
def pack(tlv_data, recalculate_length = False):
|
||||
result = []
|
||||
|
||||
for data in tlv_data:
|
||||
@@ -143,14 +143,14 @@ def pack(tlv_data, recalculate_length = False): # {{{
|
||||
result.append(value)
|
||||
|
||||
return "".join(result)
|
||||
# }}}
|
||||
|
||||
def bertlv_pack(data): # {{{
|
||||
|
||||
def bertlv_pack(data):
|
||||
"""Packs a bertlv list of 3-tuples (tag, length, newvalue) into a string"""
|
||||
return pack(data)
|
||||
# }}}
|
||||
|
||||
def unpack(data, with_marks = None, offset = 0, include_filler=False): # {{{
|
||||
|
||||
def unpack(data, with_marks = None, offset = 0, include_filler=False):
|
||||
result = []
|
||||
while len(data) > 0:
|
||||
if ord(data[0]) in (0x00, 0xFF):
|
||||
@@ -185,15 +185,15 @@ def unpack(data, with_marks = None, offset = 0, include_filler=False): # {{{
|
||||
offset = stop
|
||||
|
||||
return result
|
||||
# }}}
|
||||
|
||||
def bertlv_unpack(data): # {{{
|
||||
|
||||
def bertlv_unpack(data):
|
||||
"""Unpacks a bertlv coded string into a list of 3-tuples (tag, length,
|
||||
newvalue)."""
|
||||
return unpack(data)
|
||||
# }}}
|
||||
|
||||
def simpletlv_pack(tlv_data, recalculate_length = False): # {{{
|
||||
|
||||
def simpletlv_pack(tlv_data, recalculate_length = False):
|
||||
result = ""
|
||||
|
||||
for tag, length, value in tlv_data:
|
||||
@@ -213,9 +213,9 @@ def simpletlv_pack(tlv_data, recalculate_length = False): # {{{
|
||||
result += chr(tag) + chr(0xff)+chr(length>>8)+chr(length&0xff) + value
|
||||
|
||||
return result
|
||||
# }}}
|
||||
|
||||
def simpletlv_unpack(data): # {{{
|
||||
|
||||
def simpletlv_unpack(data):
|
||||
"""Unpacks a simpletlv coded string into a list of 3-tuples (tag, length,
|
||||
newvalue)."""
|
||||
result = []
|
||||
@@ -236,25 +236,25 @@ def simpletlv_unpack(data): # {{{
|
||||
result.append((tag, length, newvalue))
|
||||
|
||||
return result
|
||||
# }}}
|
||||
|
||||
|
||||
def decodeDiscretionaryDataObjects(tlv_data): # {{{
|
||||
|
||||
def decodeDiscretionaryDataObjects(tlv_data):
|
||||
datalist = []
|
||||
for (tag, length, newvalue) in (tlv_find_tags(tlv_data,
|
||||
[TAG["DISCRETIONARY_DATA"], TAG["DISCRETIONARY_TEMPLATE"]])):
|
||||
datalist.append(newvalue)
|
||||
return datalist
|
||||
# }}}
|
||||
def decodeOffsetDataObjects(tlv_data): # {{{
|
||||
|
||||
def decodeOffsetDataObjects(tlv_data):
|
||||
offsets = []
|
||||
for (tag, length, newvalue) in tlv_find_tag(tlv_data,
|
||||
TAG["OFFSET_DATA"]):
|
||||
offsets.append(stringtoint(newvalue))
|
||||
return offsets
|
||||
# }}}
|
||||
|
||||
def decodeTagList(tlv_data): # {{{
|
||||
|
||||
def decodeTagList(tlv_data):
|
||||
taglist = []
|
||||
for (t, l, data) in tlv_find_tag(tlv_data, TAG["TAG_LIST"]):
|
||||
while data != "":
|
||||
@@ -268,9 +268,9 @@ def decodeTagList(tlv_data): # {{{
|
||||
data = data[1:]
|
||||
taglist.append((tag, 0))
|
||||
return taglist
|
||||
# }}}
|
||||
|
||||
def decodeHeaderList(tlv_data): # {{{
|
||||
|
||||
def decodeHeaderList(tlv_data):
|
||||
headerlist = []
|
||||
for (t, l, data) in tlv_find_tag(tlv_data, TAG["HEADER_LIST"]):
|
||||
while data != "":
|
||||
@@ -296,22 +296,22 @@ def decodeHeaderList(tlv_data): # {{{
|
||||
|
||||
headerlist.append((tag, length))
|
||||
return headerlist
|
||||
# }}}
|
||||
|
||||
def decodeExtendedHeaderList(tlv_data): # {{{
|
||||
|
||||
def decodeExtendedHeaderList(tlv_data):
|
||||
# TODO
|
||||
return []
|
||||
# }}}
|
||||
|
||||
def encodebertlvDatalist(tag, datalist): # {{{
|
||||
|
||||
def encodebertlvDatalist(tag, datalist):
|
||||
tlvlist = []
|
||||
for data in datalist:
|
||||
tlvlist.append((tag, len(data), data))
|
||||
return bertlv_pack(tlvlist)
|
||||
# }}}
|
||||
def encodeDiscretionaryDataObjects(datalist): # {{{
|
||||
|
||||
def encodeDiscretionaryDataObjects(datalist):
|
||||
return encodebertlvDatalist(TAG["DISCRETIONARY_DATA"], datalist)
|
||||
# }}}
|
||||
def encodeDataOffsetObjects(datalist): # {{{
|
||||
|
||||
def encodeDataOffsetObjects(datalist):
|
||||
return encodebertlvDatalist(TAG["OFFSET_DATA"], datalist)
|
||||
# }}}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ from virtualsmartcard.CardGenerator import CardGenerator
|
||||
import socket, struct, sys, signal, atexit, smartcard, logging
|
||||
|
||||
|
||||
class SmartcardOS(object): # {{{
|
||||
class SmartcardOS(object):
|
||||
"""Base class for a smart card OS"""
|
||||
|
||||
mf = make_property("mf", "master file")
|
||||
@@ -54,9 +54,9 @@ class SmartcardOS(object): # {{{
|
||||
msg -- the APDU as string of characters
|
||||
"""
|
||||
return ""
|
||||
# }}}
|
||||
|
||||
class Iso7816OS(SmartcardOS): # {{{
|
||||
|
||||
class Iso7816OS(SmartcardOS):
|
||||
def __init__(self, mf, sam, ins2handler=None, extended_length=False):
|
||||
self.mf = mf
|
||||
self.SAM = sam
|
||||
@@ -120,7 +120,7 @@ class Iso7816OS(SmartcardOS): # {{{
|
||||
return self.atr
|
||||
|
||||
@staticmethod
|
||||
def makeATR(**args): # {{{
|
||||
def makeATR(**args):
|
||||
"""Calculate Answer to Reset (ATR) and returns the bitstring.
|
||||
|
||||
- directConvention (bool): Whether to use direct convention or
|
||||
@@ -203,10 +203,10 @@ class Iso7816OS(SmartcardOS): # {{{
|
||||
atr += "%c" % TCK
|
||||
|
||||
return atr
|
||||
# }}}
|
||||
|
||||
@staticmethod
|
||||
def makeThirdSoftwareFunctionTable(commandChainging=False,
|
||||
extendedLe=False, assignLogicalChannel=0, maximumChannels=0): # {{{
|
||||
extendedLe=False, assignLogicalChannel=0, maximumChannels=0):
|
||||
"""
|
||||
Returns a byte according to the third software function table from the
|
||||
historical bytes of the card capabilities.
|
||||
@@ -225,7 +225,7 @@ class Iso7816OS(SmartcardOS): # {{{
|
||||
raise ValueError
|
||||
tsft |= maximumChannels
|
||||
return inttostring(tsft)
|
||||
# }}}
|
||||
|
||||
|
||||
def formatResult(self, le, data, sw, sm):
|
||||
self.lastCommandOffcut = data[le:]
|
||||
@@ -329,9 +329,9 @@ class Iso7816OS(SmartcardOS): # {{{
|
||||
answer = self.formatResult(0, result, sw, False)
|
||||
|
||||
return answer
|
||||
# }}}
|
||||
|
||||
|
||||
class CryptoflexOS(Iso7816OS): # {{{
|
||||
class CryptoflexOS(Iso7816OS):
|
||||
def __init__(self, mf, sam, ins2handler=None, maxle=MAX_SHORT_LE):
|
||||
Iso7816OS.__init__(self, mf, sam, ins2handler, maxle)
|
||||
self.atr = '\x3B\xE2\x00\x00\x40\x20\x49\x06'
|
||||
@@ -376,9 +376,9 @@ class CryptoflexOS(Iso7816OS): # {{{
|
||||
r = Iso7816OS.formatResult(self, le, data, sw, False)
|
||||
|
||||
return r
|
||||
# }}}
|
||||
|
||||
class RelayOS(SmartcardOS): # {{{
|
||||
|
||||
class RelayOS(SmartcardOS):
|
||||
"""
|
||||
This class implements relaying of a (physical) smartcard. The RelayOS
|
||||
forwards the command APDUs received from the vpcd to the real smartcard via
|
||||
@@ -471,13 +471,13 @@ class RelayOS(SmartcardOS): # {{{
|
||||
rapdu = rapdu + [sw1, sw2]
|
||||
|
||||
return "".join([chr(b) for b in rapdu])
|
||||
# }}}
|
||||
|
||||
|
||||
|
||||
|
||||
# sizeof(int) taken from asizof-package {{{
|
||||
_Csizeof_short = len(struct.pack('h', 0))
|
||||
# }}}
|
||||
|
||||
|
||||
VPCD_CTRL_LEN = 1
|
||||
|
||||
@@ -486,7 +486,7 @@ VPCD_CTRL_ON = 1
|
||||
VPCD_CTRL_RESET = 2
|
||||
VPCD_CTRL_ATR = 4
|
||||
|
||||
class VirtualICC(object): # {{{
|
||||
class VirtualICC(object):
|
||||
"""
|
||||
This class is responsible for maintaining the communication of the virtual
|
||||
PCD and the emulated smartcard. vpicc and vpcd communicate via a socket.
|
||||
@@ -627,4 +627,4 @@ class VirtualICC(object): # {{{
|
||||
if self.filename != None:
|
||||
self.cardGenerator.setCard(self.os.mf, self.os.SAM)
|
||||
self.cardGenerator.saveCard(self.filename)
|
||||
# }}}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
import string, binascii
|
||||
from ConstantDefinitions import MAX_SHORT_LE, MAX_EXTENDED_LE
|
||||
|
||||
def stringtoint(str): # {{{
|
||||
def stringtoint(str):
|
||||
#i = len(str) - 1
|
||||
#int = 0
|
||||
#while i >= 0:
|
||||
@@ -29,9 +29,9 @@ def stringtoint(str): # {{{
|
||||
if str:
|
||||
return int(str.encode('hex'), 16)
|
||||
return 0
|
||||
# }}}
|
||||
|
||||
def inttostring(i, length=None): # {{{
|
||||
|
||||
def inttostring(i, length=None):
|
||||
#str = ""
|
||||
#while i > 0:
|
||||
#str = chr(i & 0xff) + str
|
||||
@@ -50,7 +50,7 @@ def inttostring(i, length=None): # {{{
|
||||
str = chr(0)*(length-l) + str
|
||||
|
||||
return str
|
||||
# }}}
|
||||
|
||||
|
||||
_myprintable = " " + string.letters + string.digits + string.punctuation
|
||||
def hexdump(data, indent = 0, short = False, linelen = 16, offset = 0):
|
||||
|
||||
Reference in New Issue
Block a user