/usr/lib/python3/dist-packages/enigma/keyfile.py is in python3-enigma 0.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | # Copyright (C) 2012 by Brian Neal.
# This file is part of Py-Enigma, the Enigma Machine simulation.
# Py-Enigma is released under the MIT License (see License.txt).
"""Contains a function to read key settings from a file.
A key file is expected to be formatted as one line per day of the month. Each
line consists of a sequence of space separated columns as follows:
day number - the first column is the day number (1-31). The lines can be in
any order.
rotor list - the next 3 or 4 columns should be rotor names.
ring settings - the next 3 or 4 columns should be ring settings. They can be
in either alphabetic (A-Z) or numeric (0-25) formats.
plugboard settings - the next 10 columns should be plugboard settings. They
can be in either alphabetic (AB CD EF ...) or numeric (1/2 3/4 ...) formats.
reflector - the last column must be the reflector name.
Comment lines have a # character in the first column. Blank lines are ignored.
Each line must either have exactly 18 or 20 columns to be valid.
"""
import datetime
class KeyFileError(Exception):
pass
def get_daily_settings(fp, day=None):
"""Read and parse a key file for daily key settings.
fp - a file-like object
day - specifies the day number to look for in the file (1-31). If day is
None, the day number from today is used.
Returns a dictionary of keyword arguments for EnigmaMachine.from_key_sheet.
"""
if day is None:
day = datetime.date.today().day
for n, line in enumerate(fp):
line = line.strip()
if line == '' or line[0] == '#':
continue
cols = line.split()
if len(cols) not in [18, 20]:
raise KeyFileError("invalid column count on line %d" % n)
rotor_count = 3 if len(cols) == 18 else 4
try:
day_num = int(cols[0])
except ValueError:
raise KeyFileError("invalid day on line %d" % n)
if day_num != day:
continue
settings = {}
if rotor_count == 3:
settings['rotors'] = cols[1:4]
settings['ring_settings'] = ' '.join(cols[4:7])
else:
settings['rotors'] = cols[1:5]
settings['ring_settings'] = ' '.join(cols[5:9])
settings['plugboard_settings'] = ' '.join(cols[-11:-1])
settings['reflector'] = cols[-1]
return settings
else:
raise KeyFileError('no entry for day %d found' % day)
return settings
|