1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
#
# Copyright (c) 2010-2012 Dominik Oepen
#
# This file is part of OpenPACE.
#
# OpenPACE 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.
#
# OpenPACE 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
# OpenPACE. If not, see <http://www.gnu.org/licenses/>.
#
"""
Object oriented wrapper for the CVC_CHAT structure and related methods from
OpenPACE
:Author: Dominik Oepen
:Date: 04.12.2011
:License: GPL
"""
import eac
class OpenPACEException(Exception):
def __init__(self, value):
self.value = eac.print_ossl_err() + value
def __str__(self):
return self.value
class CHAT(object):
def __init__(self, chat):
if (type(chat) == str):
self.asn1_string = chat
self.chat = eac.d2i_CVC_CHAT(chat)
elif (type(chat).__name__ == 'SwigPyObject'):
self.asn1_string = eac.i2d_CVC_CHAT(chat)
self.chat = eac.CVC_CHAT_dup(chat)
if (self.chat is None or self.asn1_string is None):
raise OpenPACEException("Failed to parse CHAT")
def __del__(self):
eac.CVC_CHAT_free(self.chat)
def __str__(self):
ret = eac.get_chat_repr(self.chat)
if ret is None:
raise OpenPACEException("Failed to parse CHAT")
return ret
def get_role(self):
ret = eac.get_chat_role(self.chat)
if ret is None:
raise OpenPACEException("Failed to retrieve terminal role from CHAT")
return ret
def get_terminal_type(self):
ret = eac.get_chat_terminal_type(self.chat)
if ret is None:
raise OpenPACEException("Failed to retrieve terminal type from CHAT")
return ret
def get_relative_authorizations(self):
ret = eac.get_chat_rel_auth(self.chat)
if ret is None:
raise OpenPACEException("Failed to retrieve relative authorization from CHAT")
return ret
class CVC(object):
def __init__(self, asn1_string):
self.asn1_string = asn1_string
self.cvc = eac.CVC_d2i_CVC_CERT(asn1_string)
if not self.cvc:
raise TypeError("Failed to parse certificate")
self.chat = CHAT(eac.cvc_get_chat(self.cvc))
def __del__(self):
eac.CVC_CERT_free(self.cvc)
def __str__(self):
ret = eac.get_cvc_repr(self.cvc)
if ret is None:
raise OpenPACEException("Failed to parse CV certificate")
return ret
def get_car(self):
ret = eac.CVC_get_car(self.cvc)
if ret is None:
raise OpenPACEException("Failed to extract CAR")
return ret
def get_chr(self):
ret = eac.CVC_get_chr(self.cvc)
if ret is None:
raise OpenPACEException("Failed to extract CHR")
return ret
def get_effective_date(self):
ret = eac.CVC_get_effective_date(self.cvc)
if ret is None:
raise OpenPACEException("Failed to extract effective date")
return ret
def get_expiration_date(self):
ret = eac.CVC_get_expiration_date(self.cvc)
if ret is None:
raise OpenPACEException("Failed to extract expiration date")
return ret
def get_profile_identifier(self):
profile_id = eac.CVC_get_profile_identifier(self.cvc)
return profile_id
class EAC_CTX(object):
def __init__(self):
self.ctx = eac.EAC_CTX_new()
if not self.ctx:
raise TypeError("Failed to create context")
def __del__(self):
eac.EAC_CTX_clear_free(self.ctx)
def __str__(self):
ret = eac.EAC_CTX_print_private(self.ctx)
if ret is None:
raise OpenPACEException("Failed to print EAC_CTX")
return ret
class PACE_SEC(object):
def __init__(self, secret, secret_type):
self.sec = eac.PACE_SEC_new(secret, secret_type)
if not self.sec:
raise TypeError("Failed to create context")
def __del__(self):
eac.PACE_SEC_clear_free(self.sec)
def __str__(self):
ret = eac.PACE_SEC_print_private(self.sec)
if ret is None:
raise OpenPACEException("Failed to print PACE_SEC")
return ret
|