moved NPAOS to nPA.py
This commit is contained in:
@@ -350,66 +350,6 @@ class Iso7816OS(SmartcardOS):
|
|||||||
return answer
|
return answer
|
||||||
|
|
||||||
|
|
||||||
class NPAOS(Iso7816OS):
|
|
||||||
def __init__(self, mf, sam, ins2handler=None, maxle=MAX_EXTENDED_LE, ef_cardsecurity=None, ef_cardaccess=None, ca_key=None, cvca=None, disable_checks=False, esign_key=None, esign_ca_cert=None, esign_cert=None):
|
|
||||||
Iso7816OS.__init__(self, mf, sam, ins2handler, maxle)
|
|
||||||
self.ins2handler[0x86] = self.SAM.general_authenticate
|
|
||||||
self.ins2handler[0x2c] = self.SAM.reset_retry_counter
|
|
||||||
|
|
||||||
# different ATR (Answer To Reset) values depending on used Chip version
|
|
||||||
# It's just a playground, because in past one of all those eID clients did not recognize the card correctly with newest ATR values
|
|
||||||
self.atr = '\x3B\x8A\x80\x01\x80\x31\xF8\x73\xF7\x41\xE0\x82\x90\x00\x75'
|
|
||||||
#self.atr = '\x3B\x8A\x80\x01\x80\x31\xB8\x73\x84\x01\xE0\x82\x90\x00\x06'
|
|
||||||
#self.atr = '\x3B\x88\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x09'
|
|
||||||
#self.atr = '\x3B\x87\x80\x01\x80\x31\xB8\x73\x84\x01\xE0\x19'
|
|
||||||
|
|
||||||
self.SAM.current_SE.disable_checks = disable_checks
|
|
||||||
if ef_cardsecurity:
|
|
||||||
ef = self.mf.select('fid', 0x011d)
|
|
||||||
ef.data = ef_cardsecurity
|
|
||||||
if ef_cardaccess:
|
|
||||||
ef = self.mf.select('fid', 0x011c)
|
|
||||||
ef.data = ef_cardaccess
|
|
||||||
if cvca:
|
|
||||||
self.SAM.current_SE.cvca = cvca
|
|
||||||
if ca_key:
|
|
||||||
self.SAM.current_SE.ca_key = ca_key
|
|
||||||
esign = self.mf.select('dfname', '\xA0\x00\x00\x01\x67\x45\x53\x49\x47\x4E')
|
|
||||||
if esign_ca_cert:
|
|
||||||
ef = esign.select('fid', 0xC000)
|
|
||||||
ef.data = esign_ca_cert
|
|
||||||
if esign_cert:
|
|
||||||
ef = esign.select('fid', 0xC001)
|
|
||||||
ef.data = esign_cert
|
|
||||||
|
|
||||||
|
|
||||||
def formatResult(self, seekable, le, data, sw, sm):
|
|
||||||
if seekable:
|
|
||||||
# when le = 0 then we want to have 0x9000. here we only have the
|
|
||||||
# effective le, which is either MAX_EXTENDED_LE or MAX_SHORT_LE,
|
|
||||||
# depending on the APDU. Note that the following distinguisher has
|
|
||||||
# one false positive
|
|
||||||
if le > len(data) and le != MAX_EXTENDED_LE and le != MAX_SHORT_LE:
|
|
||||||
sw = SW["WARN_EOFBEFORENEREAD"]
|
|
||||||
|
|
||||||
if le != None:
|
|
||||||
result = data[:le]
|
|
||||||
else:
|
|
||||||
result = data[:0]
|
|
||||||
if sm:
|
|
||||||
try:
|
|
||||||
sw, result = self.SAM.protect_result(sw, result)
|
|
||||||
except SwError as e:
|
|
||||||
logging.info(e.message)
|
|
||||||
import traceback
|
|
||||||
traceback.print_exception(*sys.exc_info())
|
|
||||||
sw = e.sw
|
|
||||||
result = ""
|
|
||||||
answer = self.formatResult(False, 0, result, sw, False)
|
|
||||||
|
|
||||||
return R_APDU(result, inttostring(sw)).render()
|
|
||||||
|
|
||||||
|
|
||||||
class HandlerTestOS(SmartcardOS):
|
class HandlerTestOS(SmartcardOS):
|
||||||
"""
|
"""
|
||||||
This class implements the commands used for the PC/SC-lite smart card
|
This class implements the commands used for the PC/SC-lite smart card
|
||||||
@@ -529,6 +469,7 @@ 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":
|
||||||
|
from virtualsmartcard.cards.nPA import NPAOS
|
||||||
self.os = NPAOS(MF, SAM, ef_cardsecurity=ef_cardsecurity, ef_cardaccess=ef_cardaccess, ca_key=ca_key, cvca=cvca, disable_checks=disable_checks, esign_key=esign_key, esign_ca_cert=esign_ca_cert, esign_cert=esign_cert)
|
self.os = NPAOS(MF, SAM, ef_cardsecurity=ef_cardsecurity, ef_cardaccess=ef_cardaccess, ca_key=ca_key, cvca=cvca, disable_checks=disable_checks, esign_key=esign_key, esign_ca_cert=esign_ca_cert, esign_cert=esign_cert)
|
||||||
elif card_type == "cryptoflex":
|
elif card_type == "cryptoflex":
|
||||||
from virtualsmartcard.cards.cryptoflex import CryptoflexOS
|
from virtualsmartcard.cards.cryptoflex import CryptoflexOS
|
||||||
|
|||||||
@@ -17,17 +17,79 @@
|
|||||||
# virtualsmartcard. If not, see <http://www.gnu.org/licenses/>.
|
# virtualsmartcard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from virtualsmartcard.SmartcardSAM import SAM
|
from virtualsmartcard.SmartcardSAM import SAM
|
||||||
|
from virtualsmartcard.VirtualSmartcard import Iso7816OS
|
||||||
from virtualsmartcard.SEutils import ControlReferenceTemplate, Security_Environment
|
from virtualsmartcard.SEutils import ControlReferenceTemplate, Security_Environment
|
||||||
from virtualsmartcard.SWutils import SwError, SW
|
from virtualsmartcard.SWutils import SwError, SW
|
||||||
from virtualsmartcard.ConstantDefinitions import CRT_TEMPLATE, SM_Class, ALGO_MAPPING
|
from virtualsmartcard.ConstantDefinitions import CRT_TEMPLATE, SM_Class, ALGO_MAPPING, MAX_EXTENDED_LE, MAX_SHORT_LE
|
||||||
from virtualsmartcard.TLVutils import unpack, bertlv_pack, decodeDiscretionaryDataObjects, tlv_find_tag
|
from virtualsmartcard.TLVutils import unpack, bertlv_pack, decodeDiscretionaryDataObjects, tlv_find_tag
|
||||||
from virtualsmartcard.SmartcardFilesystem import make_property
|
from virtualsmartcard.SmartcardFilesystem import make_property
|
||||||
from virtualsmartcard.utils import inttostring
|
from virtualsmartcard.utils import inttostring, R_APDU
|
||||||
import virtualsmartcard.CryptoUtils as vsCrypto
|
import virtualsmartcard.CryptoUtils as vsCrypto
|
||||||
from chat import CHAT, CVC, PACE_SEC, EAC_CTX
|
from chat import CHAT, CVC, PACE_SEC, EAC_CTX
|
||||||
import eac
|
import eac
|
||||||
import logging, binascii
|
import logging, binascii
|
||||||
|
|
||||||
|
|
||||||
|
class NPAOS(Iso7816OS):
|
||||||
|
def __init__(self, mf, sam, ins2handler=None, maxle=MAX_EXTENDED_LE, ef_cardsecurity=None, ef_cardaccess=None, ca_key=None, cvca=None, disable_checks=False, esign_key=None, esign_ca_cert=None, esign_cert=None):
|
||||||
|
Iso7816OS.__init__(self, mf, sam, ins2handler, maxle)
|
||||||
|
self.ins2handler[0x86] = self.SAM.general_authenticate
|
||||||
|
self.ins2handler[0x2c] = self.SAM.reset_retry_counter
|
||||||
|
|
||||||
|
# different ATR (Answer To Reset) values depending on used Chip version
|
||||||
|
# It's just a playground, because in past one of all those eID clients did not recognize the card correctly with newest ATR values
|
||||||
|
self.atr = '\x3B\x8A\x80\x01\x80\x31\xF8\x73\xF7\x41\xE0\x82\x90\x00\x75'
|
||||||
|
#self.atr = '\x3B\x8A\x80\x01\x80\x31\xB8\x73\x84\x01\xE0\x82\x90\x00\x06'
|
||||||
|
#self.atr = '\x3B\x88\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x09'
|
||||||
|
#self.atr = '\x3B\x87\x80\x01\x80\x31\xB8\x73\x84\x01\xE0\x19'
|
||||||
|
|
||||||
|
self.SAM.current_SE.disable_checks = disable_checks
|
||||||
|
if ef_cardsecurity:
|
||||||
|
ef = self.mf.select('fid', 0x011d)
|
||||||
|
ef.data = ef_cardsecurity
|
||||||
|
if ef_cardaccess:
|
||||||
|
ef = self.mf.select('fid', 0x011c)
|
||||||
|
ef.data = ef_cardaccess
|
||||||
|
if cvca:
|
||||||
|
self.SAM.current_SE.cvca = cvca
|
||||||
|
if ca_key:
|
||||||
|
self.SAM.current_SE.ca_key = ca_key
|
||||||
|
esign = self.mf.select('dfname', '\xA0\x00\x00\x01\x67\x45\x53\x49\x47\x4E')
|
||||||
|
if esign_ca_cert:
|
||||||
|
ef = esign.select('fid', 0xC000)
|
||||||
|
ef.data = esign_ca_cert
|
||||||
|
if esign_cert:
|
||||||
|
ef = esign.select('fid', 0xC001)
|
||||||
|
ef.data = esign_cert
|
||||||
|
|
||||||
|
|
||||||
|
def formatResult(self, seekable, le, data, sw, sm):
|
||||||
|
if seekable:
|
||||||
|
# when le = 0 then we want to have 0x9000. here we only have the
|
||||||
|
# effective le, which is either MAX_EXTENDED_LE or MAX_SHORT_LE,
|
||||||
|
# depending on the APDU. Note that the following distinguisher has
|
||||||
|
# one false positive
|
||||||
|
if le > len(data) and le != MAX_EXTENDED_LE and le != MAX_SHORT_LE:
|
||||||
|
sw = SW["WARN_EOFBEFORENEREAD"]
|
||||||
|
|
||||||
|
if le != None:
|
||||||
|
result = data[:le]
|
||||||
|
else:
|
||||||
|
result = data[:0]
|
||||||
|
if sm:
|
||||||
|
try:
|
||||||
|
sw, result = self.SAM.protect_result(sw, result)
|
||||||
|
except SwError as e:
|
||||||
|
logging.info(e.message)
|
||||||
|
import traceback
|
||||||
|
traceback.print_exception(*sys.exc_info())
|
||||||
|
sw = e.sw
|
||||||
|
result = ""
|
||||||
|
answer = self.formatResult(False, 0, result, sw, False)
|
||||||
|
|
||||||
|
return R_APDU(result, inttostring(sw)).render()
|
||||||
|
|
||||||
|
|
||||||
class nPA_AT_CRT(ControlReferenceTemplate):
|
class nPA_AT_CRT(ControlReferenceTemplate):
|
||||||
|
|
||||||
PACE_MRZ = 0x01
|
PACE_MRZ = 0x01
|
||||||
@@ -100,6 +162,7 @@ class nPA_AT_CRT(ControlReferenceTemplate):
|
|||||||
|
|
||||||
return r, ""
|
return r, ""
|
||||||
|
|
||||||
|
|
||||||
class nPA_SE(Security_Environment):
|
class nPA_SE(Security_Environment):
|
||||||
|
|
||||||
eac_step = make_property("eac_step", "next step to performed for EAC")
|
eac_step = make_property("eac_step", "next step to performed for EAC")
|
||||||
|
|||||||
Reference in New Issue
Block a user