From 660e9d996132099a88a0ffc3ae6851a0c6cf689e Mon Sep 17 00:00:00 2001 From: acidvegas Date: Sat, 11 May 2024 20:29:07 -0400 Subject: [PATCH] Initial commit --- LICENSE | 15 +++++++++++ README.md | 12 +++++++++ msr90.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 msr90.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..54ec6ab --- /dev/null +++ b/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2024, acidvegas + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..87c138f --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# MSR90 +> A journey into learning about magnetic strip data in modern day cards + +#### WORK IN PROGRESS +**Hardware:** [Deftun MSR90 3 Track Reader](https://www.amazon.com/MSR90-Magnetic-Credit-Reader-Deftun/dp/B01DUB4GVO/) + +I will be documenting all my research on magnetic strip data aswell at writing code for it. +For some reason it seems hard to find code or any valid documentation on working with magnetic strip data on Linux, so this will attempt to be a deep dive into understanding the capabilities. + +___ + +###### Mirrors for this repository: [acid.vegas](https://git.acid.vegas/msr90) • [SuperNETs](https://git.supernets.org/acidvegas/msr90) • [GitHub](https://github.com/acidvegas/msr90) • [GitLab](https://gitlab.com/acidvegas/msr90) • [Codeberg](https://codeberg.org/acidvegas/msr90) \ No newline at end of file diff --git a/msr90.py b/msr90.py new file mode 100644 index 0000000..1c09c55 --- /dev/null +++ b/msr90.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# MSR90 Card Reader - Developed by acidvegas in Python (https://acid.vegas/msr90) + +import re + +# ANSI Escape Codes +YELLOW = '\033[93m' +RESET = '\033[0m' + +# Numeric values for the service code +service_code_values = { + '0': 'No restrictions and PIN required.', + '1': 'No restrictions.', + '2': 'Goods and services only (no cash).', + '3': 'ATM only and PIN required.', + '4': 'Cash only.', + '5': 'Goods and services only (no cash), PIN required.', + '6': 'No restrictions, use of PIN depends on issuers requirements.', + '7': 'Goods and services only, use of PIN depends on issuers requirements.' +} + +# Description of the format code +format_code_values = { + 'A': 'Reserved for proprietary use of the card issuer.', + 'B': 'Used by financial and credit card systems.' +} + +def parse_magnetic_stripe(data: str): + ''' + Parse the raw data from the magnetic stripe of a card. + + :param data: Raw data from the magnetic stripe of a card. + ''' + + # Regex to match the track 1 and track 2 data + track1 = re.search(r'%([AB])(\d+)\^([^?^]+)\^(\d{4})(\d{3}).*?\?', data) + track2 = re.search(r';(\d+)=(\d{4})(\d{3}).*?\?', data) + + # Check if the data is valid + if not track1 or not track2: + raise ValueError('Invalid data format') + + # Parse the data from the track 1 and track 2 + format_code = track1.group(1) + account_number = track1.group(2) + name = track1.group(3).strip() + expiry_date = track1.group(4) + expiry_date = f'{expiry_date[2:4]}/{expiry_date[0:2]}' + service_code = track1.group(5) + + service_code_description = [ + f'{service_code[0]} - {service_code_values.get(service_code[0], 'Unknown')}', + f'{service_code[1]} - {service_code_values.get(service_code[1], 'Unknown')}', + f'{service_code[2]} - {service_code_values.get(service_code[2], 'Unknown')}' + ] + + format_code_description = format_code_values.get(format_code, 'Unknown') + + # Print the parsed data + print(f'{YELLOW}Name :{RESET} {name}') + print(f'{YELLOW}Account Number :{RESET} {account_number}') + print(f'{YELLOW}Expiration Date :{RESET} {expiry_date}') + print(f'{YELLOW}Service Code :{RESET} {service_code}') + for item in service_code_description: + print(' '*18 + item) + print(f'{YELLOW}Format Code :{RESET} {format_code} ({format_code_description})') + print(f'{YELLOW}Track 1 :{RESET} {track1.group(0)}') + print(f'{YELLOW}Track 2 :{RESET} {track2.group(0)}') + +def main(): + print('Please swipe the card...') + data = input() + parse_magnetic_stripe(data) + +if __name__ == '__main__': + main()