Пример #1
0
def get_icc_certificate(ipk_certificate: str, card_tags: Mapping[str, EmvTag]):
    ipk_certificate_modulus = convert_hex_str_2_int(ipk_certificate)
    ipk_certificate_exponent = convert_hex_str_2_int(card_tags['9F32'].value)
    icc_public_key = card_tags['9F46'].value
    icc_public_key_int = convert_hex_str_2_int(icc_public_key)
    ca_ipk = RSAPublicKey(ipk_certificate_modulus, ipk_certificate_exponent)
    decrypted = ca_ipk.decrypt(icc_public_key_int)
    icc_public_key_decrypted = convert_int_2_hex_str(decrypted)
    print(icc_public_key_decrypted)
Пример #2
0
def get_issuer_public_key(application: str, card_tags: Mapping[str, EmvTag]):
    ca_key = ca_public_keys[application[0:10]][card_tags['8F'].value]
    ca_key_modulus = convert_hex_str_2_int(ca_key['modulus'])
    ca_key_exponent = ca_key['exponent']
    issuer_public_key = card_tags['90'].value
    issuer_public_key_int = convert_hex_str_2_int(issuer_public_key)
    ca_ipk = RSAPublicKey(ca_key_modulus, ca_key_exponent)
    decrypted = ca_ipk.decrypt(issuer_public_key_int)
    issuer_public_key_decrypted = convert_int_2_hex_str(decrypted)
    print(issuer_public_key_decrypted)
    return issuer_public_key_decrypted[30:-42]
Пример #3
0
def parse_sfi(sfi_block: str) -> Tuple[int, int, int, int]:
    """
    Get an afl block with 4 bytes and separate its values in a tuple
    :param sfi_block: str of 4 bytes
    :return: Tuple[sfi_number, first_record, last_record, signed_records]
    """
    sfi = get_n_bytes(sfi_block, 1)[0]
    sfi = convert_hex_str_2_int(sfi) >> 3
    first_record = convert_hex_str_2_int(get_n_bytes(sfi_block, 1, 1)[0])
    last_record = convert_hex_str_2_int(get_n_bytes(sfi_block, 1, 2)[0])
    signed_record = convert_hex_str_2_int(get_n_bytes(sfi_block, 1, 3)[0])
    return sfi, first_record, last_record, signed_record
Пример #4
0
def get_n_bytes(hex_str: str,
                byte_qtd: Union[str, int],
                offset: Union[str, int] = 0) -> Tuple[str, str]:
    """
    Get N bytes of the provided hex_str
    """
    if isinstance(byte_qtd, str):
        byte_qtd = convert_hex_str_2_int(byte_qtd)
    if isinstance(offset, str):
        offset = convert_hex_str_2_int(offset)
    offset *= 2
    final = offset + byte_qtd * 2
    return hex_str[offset:final], hex_str[final:]
Пример #5
0
# coding=utf-8
from Utils.Classes.RSA.RSAPublicKey import RSAPublicKey
from Utils.Convert import convert_hex_str_2_int, convert_int_2_hex_str
from Utils.EMVValues.CaPublicKeys import ca_public_keys

ca_key = ca_public_keys['A000000004']['05']

ca_key_modulus = convert_hex_str_2_int(ca_key['modulus'])
ca_key_exponent = ca_key['exponent']
issuer_public_key = (
    '0160D9786A87CBCCE94E4FFB07333BB3ED704C4EF31D933A770172632717B367DD75C22D962BF600C2279D0BE2FE30DFE'
    '06BA1637E39E2AC9C5096466D17D5D3507659FE5474174E60EFA6936B34BF789BAB07F4DE27C84E12D62EE7CFCCC6B14E'
    'B57A8CA4B3814645712D4B067A7C8BE1A223C594619D7569B9D2DF03E1AB742C07E0050027EA72202D5B6F301217F81A0'
    'B53AE612DDBD81CC887FE72066FAD8C1CEEE8FD6846A3A511C3DE10CA8930')

issuer_public_key_int = convert_hex_str_2_int(issuer_public_key)

ca_ipk = RSAPublicKey(ca_key_modulus, ca_key_exponent)
decrypted = ca_ipk.decrypt(issuer_public_key_int)
print(convert_int_2_hex_str(decrypted))
Пример #6
0
parsed = tlvParser.parse(card_connection.response)
print(parsed)

card_connection.disconnect()
print(signed_records)
print(card_tags)

print('*' * 100)
print(f'OFFLINE DATA AUTHENTICATION BEGIN')
print('*' * 100)

print('*' * 100)
print(f'USE CA PUBLIC KEY TO GET ISSUER PUBLIC KEY')
print('*' * 100)
ca_public_key_values = ca_public_keys[application[0:10]][card_tags['8F'].value]
ca_public_key_modulus = convert_hex_str_2_int(ca_public_key_values['modulus'])
ca_public_key_exponent = ca_public_key_values['exponent']
issuer_public_key = convert_hex_str_2_int(card_tags['90'].value)
ca_public_key = RSAPublicKey(ca_public_key_modulus, ca_public_key_exponent)
decrypted = ca_public_key.decrypt(issuer_public_key)
issuer_public_key_decrypted = convert_int_2_hex_str(decrypted)

assert get_n_bytes(issuer_public_key_decrypted, 1)[0] == '6A'
assert get_n_bytes(issuer_public_key_decrypted, 1, 1)[0] == '02'

pan_leftmost_digits = get_n_bytes(issuer_public_key_decrypted, 4,
                                  2)[0].replace('FF', '')
assert card_tags['5A'].value.startswith(pan_leftmost_digits)
print(issuer_public_key_decrypted)