Do not overide the OS but only the SAM and parts of the SE for nPA emulation

git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@647 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
oepen
2011-12-08 13:38:37 +00:00
parent 379aa7310e
commit ca6fd219d2
4 changed files with 59 additions and 71 deletions

View File

@@ -19,6 +19,7 @@ vpicc_PYTHON = virtualsmartcard/CardGenerator.py \
vpicccards_PYTHON = virtualsmartcard/cards/__init__.py \ vpicccards_PYTHON = virtualsmartcard/cards/__init__.py \
virtualsmartcard/cards/ePass.py \ virtualsmartcard/cards/ePass.py \
virtualsmartcard/cards/nPA.py \
virtualsmartcard/cards/cryptoflex.py virtualsmartcard/cards/cryptoflex.py
do_subst = sed -e 's,[@]PYTHON[@],$(PYTHON),g' do_subst = sed -e 's,[@]PYTHON[@],$(PYTHON),g'

View File

@@ -27,6 +27,7 @@ from virtualsmartcard.CryptoUtils import protect_string, read_protected_string
from virtualsmartcard.SmartcardSAM import SAM from virtualsmartcard.SmartcardSAM import SAM
from virtualsmartcard.cards.cryptoflex import CryptoflexSAM, CryptoflexMF from virtualsmartcard.cards.cryptoflex import CryptoflexSAM, CryptoflexMF
from virtualsmartcard.cards.ePass import PassportSAM from virtualsmartcard.cards.ePass import PassportSAM
from virtualsmartcard.cards.nPA import nPA_SAM
# pgp directory # pgp directory
#self.mf.append(DF(parent=self.mf, #self.mf.append(DF(parent=self.mf,
@@ -147,6 +148,7 @@ class CardGenerator(object):
self.mf = MF() self.mf = MF()
self.mf.append(TransparentStructureEF(parent=self.mf, fid=0x011c, shortfid=0x1c, data=card_access)) self.mf.append(TransparentStructureEF(parent=self.mf, fid=0x011c, shortfid=0x1c, data=card_access))
self.sam = nPA_SAM()
def __generate_cryptoflex(self): def __generate_cryptoflex(self):
"""Generate the Filesystem and SAM of a cryptoflex card""" """Generate the Filesystem and SAM of a cryptoflex card"""

View File

@@ -331,76 +331,6 @@ class Iso7816OS(SmartcardOS):
return answer return answer
class nPAOS(Iso7816OS):
def __init__(self, mf, sam):
# ugly hack to parse MSE:SET AT
# This should better be integrated in the secuirty environment
ins2handler = {
0x0c: mf.eraseRecord,
0x0e: mf.eraseBinaryPlain,
0x0f: mf.eraseBinaryEncapsulated,
0x22: self.manage_security_environment,
0xa0: mf.searchBinaryPlain,
0xa1: mf.searchBinaryEncapsulated,
0xa4: mf.selectFile,
0xb0: mf.readBinaryPlain,
0xb1: mf.readBinaryEncapsulated,
0xb2: mf.readRecordPlain,
0xb3: mf.readRecordEncapsulated,
0xc0: self.getResponse,
0xca: mf.getDataPlain,
0xcb: mf.getDataEncapsulated,
0xd0: mf.writeBinaryPlain,
0xd1: mf.writeBinaryEncapsulated,
0xd2: mf.writeRecord,
0xd6: mf.updateBinaryPlain,
0xd7: mf.updateBinaryEncapsulated,
0xda: mf.putDataPlain,
0xdb: mf.putDataEncapsulated,
0xdc: mf.updateRecordPlain,
0xdd: mf.updateRecordEncapsulated,
0xe0: mf.createFile,
0xe2: mf.appendRecord,
0xe4: mf.deleteFile,
}
Iso7816OS.__init__(self, mf, sam, ins2handler, MAX_EXTENDED_LE)
# TODO
self.atr = '\x3B\x8A\x80\x01\x80\x31\xF8\x73\xF7\x41\xE0\x82\x90\x00\x75'
def manage_security_environment(self, p1, p2, data):
from TLVutils import bertlv_pack, bertlv_unpack
if (p1, p2) == (0xc1, 0xa4):
# PACE
tlv_data = bertlv_unpack(data)
for tag, length, value in tlv_data:
if tag == 0x80:
mechanism = value
#print "mechanism %r"% mechanism
elif tag == 0x83:
ref_public_key = value
#print "ref_public_key %r"% ref_public_key
elif tag == 0x84:
ref_private_key = value
#print "ref_private_key %r"% ref_private_key
elif tag == 0x67:
auxiliary_data = value
#print "auxiliary_data %r"% auxiliary_data
elif tag == 0x7f4c:
from chat import CHAT
chat = CHAT(bertlv_pack([[tag, length, value]]))
print(chat)
raise SwError(SW["ERR_INSNOTSUPPORTED"])
elif (p1, p2) == (0x41, 0xa4):
# CA/RI
raise SwError(SW["ERR_INSNOTSUPPORTED"])
elif (p1, p2) == (0x81, 0xa4):
# TA
raise SwError(SW["ERR_INSNOTSUPPORTED"])
else:
raise SwError(SW["ERR_INCORRECTP1P2"])
class CryptoflexOS(Iso7816OS): class CryptoflexOS(Iso7816OS):
def __init__(self, mf, sam, ins2handler=None, maxle=MAX_SHORT_LE): def __init__(self, mf, sam, ins2handler=None, maxle=MAX_SHORT_LE):
Iso7816OS.__init__(self, mf, sam, ins2handler, maxle) Iso7816OS.__init__(self, mf, sam, ins2handler, maxle)
@@ -591,7 +521,8 @@ class VirtualICC(object):
if card_type == "iso7816" or card_type == "ePass": if card_type == "iso7816" or card_type == "ePass":
self.os = Iso7816OS(MF, SAM) self.os = Iso7816OS(MF, SAM)
elif card_type == "nPA": elif card_type == "nPA":
self.os = nPAOS(MF, SAM) self.os = Iso7816OS(MF, SAM)
self.os.atr = '\x3B\x8A\x80\x01\x80\x31\xF8\x73\xF7\x41\xE0\x82\x90\x00\x75'
elif card_type == "cryptoflex": elif card_type == "cryptoflex":
self.os = CryptoflexOS(MF, SAM) self.os = CryptoflexOS(MF, SAM)
elif card_type == "relay": elif card_type == "relay":

View File

@@ -0,0 +1,54 @@
#
# Copyright (C) 2011 Dominik Oepen
#
# This file is part of virtualsmartcard.
#
# virtualsmartcard is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# virtualsmartcard is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# virtualsmartcard. If not, see <http://www.gnu.org/licenses/>.
from virtualsmartcard.SmartcardSAM import SAM
from virtualsmartcard.SEutils import ControlReferenceTemplate
from virtualsmartcard.SWutils import SwError, SW
from virtualsmartcard.ConstantDefinitions import CRT_TEMPLATE
from virtualsmartcard.TLVutils import unpack, bertlv_pack
import hashlib, struct
from os import urandom
class nPA__AT_CRT(ControlReferenceTemplate):
def __init__(self):
ControlReferenceTemplate(CRT_TEMPLATE["AT"])
def parse_SE_config(self, config)
try:
ControlReferenceTemplate.parse_SE_config(self, config)
except SwError, e:
structure = unpack(config)
for tlv in structure:
tag, length, value = structure
if tag == 0x7f4c:
chat = CHAT(bertlv_pack([tlv])
print chat
elif tag == 0x67:
auxiliary_data = value
else:
raise SwError(SW["ERR_REFNOTUSABLE"])
class nPA_SAM(SAM):
"""
SAM for ICAO ePassport. Implements Basic access control and key derivation
for Secure Messaging.
"""
def __init__(self, mf):
SAM.__init__(self, None, None, mf)
self.current_SE.at = nPA_AT_CRT()