Skip to content

Commit

Permalink
Merge pull request #29 from adafruit/pylint-update
Browse files Browse the repository at this point in the history
Ran black, updated to pylint 2.x
  • Loading branch information
kattni committed Mar 17, 2020
2 parents c01e196 + 668ef26 commit 4a0cb9d
Show file tree
Hide file tree
Showing 12 changed files with 346 additions and 191 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
source actions-ci/install.sh
- name: Pip install pylint, black, & Sphinx
run: |
pip install --force-reinstall pylint==1.9.2 black==19.10b0 Sphinx sphinx-rtd-theme
pip install --force-reinstall pylint black==19.10b0 Sphinx sphinx-rtd-theme
- name: Library version
run: git describe --dirty --always --tags
- name: PyLint
Expand Down
47 changes: 26 additions & 21 deletions adafruit_tinylora/adafruit_tinylora.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,20 +169,26 @@ def __init__(self, spi, cs, irq, rst, ttn_config, channel=None):
self._modemcfg = None
self.set_datarate("SF7BW125")
# Set regional frequency plan
# pylint: disable=import-outside-toplevel
if "US" in ttn_config.country:
from adafruit_tinylora.ttn_usa import TTN_FREQS

self._frequencies = TTN_FREQS
elif ttn_config.country == "AS":
from adafruit_tinylora.ttn_as import TTN_FREQS

self._frequencies = TTN_FREQS
elif ttn_config.country == "AU":
from adafruit_tinylora.ttn_au import TTN_FREQS

self._frequencies = TTN_FREQS
elif ttn_config.country == "EU":
from adafruit_tinylora.ttn_eu import TTN_FREQS

self._frequencies = TTN_FREQS
else:
raise TypeError("Country Code Incorrect/Unsupported")
# pylint: enable=import-outside-toplevel
# Set Channel Number
self._channel = channel
self._tx_random = randint(0, 7)
Expand All @@ -193,24 +199,23 @@ def __init__(self, spi, cs, irq, rst, ttn_config, channel=None):
self.frame_counter = 0
# Set up RFM9x for LoRa Mode
for pair in (
(_REG_OPERATING_MODE, _MODE_SLEEP),
(_REG_OPERATING_MODE, _MODE_LORA),
(_REG_PA_CONFIG, 0xFF),
(_REG_PREAMBLE_DETECT, 0x25),
(_REG_PREAMBLE_MSB, 0x00),
(_REG_PREAMBLE_LSB, 0x08),
(_REG_MODEM_CONFIG, 0x0C),
(_REG_TIMER1_COEF, 0x34),
(_REG_NODE_ADDR, 0x27),
(_REG_IMAGE_CAL, 0x1D),
(_REG_RSSI_CONFIG, 0x80),
(_REG_RSSI_COLLISION, 0x00),
(_REG_OPERATING_MODE, _MODE_SLEEP),
(_REG_OPERATING_MODE, _MODE_LORA),
(_REG_PA_CONFIG, 0xFF),
(_REG_PREAMBLE_DETECT, 0x25),
(_REG_PREAMBLE_MSB, 0x00),
(_REG_PREAMBLE_LSB, 0x08),
(_REG_MODEM_CONFIG, 0x0C),
(_REG_TIMER1_COEF, 0x34),
(_REG_NODE_ADDR, 0x27),
(_REG_IMAGE_CAL, 0x1D),
(_REG_RSSI_CONFIG, 0x80),
(_REG_RSSI_COLLISION, 0x00),
):
self._write_u8(pair[0], pair[1])
# Give the lora object ttn configuration
self._ttn_config = ttn_config


def __enter__(self):
return self

Expand Down Expand Up @@ -296,14 +301,14 @@ def send_packet(self, lora_packet, packet_length, timeout):
self._rfm_msb = self._frequencies[self._tx_random][0]
# Set up frequency registers
for pair in (
(_REG_FRF_MSB, self._rfm_msb),
(_REG_FRF_MID, self._rfm_mid),
(_REG_FRF_LSB, self._rfm_lsb),
(_REG_FEI_LSB, self._sf),
(_REG_FEI_MSB, self._bw),
(_REG_MODEM_CONFIG, self._modemcfg),
(_REG_PAYLOAD_LENGTH, packet_length),
(_REG_FIFO_POINTER, _REG_FIFO_BASE_ADDR),
(_REG_FRF_MSB, self._rfm_msb),
(_REG_FRF_MID, self._rfm_mid),
(_REG_FRF_LSB, self._rfm_lsb),
(_REG_FEI_LSB, self._sf),
(_REG_FEI_MSB, self._bw),
(_REG_MODEM_CONFIG, self._modemcfg),
(_REG_PAYLOAD_LENGTH, packet_length),
(_REG_FIFO_POINTER, _REG_FIFO_BASE_ADDR),
):
self._write_u8(pair[0], pair[1])
# fill the FIFO buffer with the LoRa payload
Expand Down
86 changes: 53 additions & 33 deletions adafruit_tinylora/adafruit_tinylora_encryption.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,29 @@ def xtime(col):
"""
return (((col << 1) ^ 0x1B) & 0xFF) if (col & 0x80) else (col << 1)


# AES S-box
S_BOX = (b'c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv',
b'\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0',
b'\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15',
b"\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb'\xb2u",
b'\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84',
b'S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf',
b'\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8',
b'Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2',
b'\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s',
b'`\x81O\xdc"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb',
b'\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y',
b'\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08',
b'\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8a',
b'p>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e',
b'\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf',
b'\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16')
S_BOX = (
b"c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv",
b"\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0",
b"\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15",
b"\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb'\xb2u",
b"\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84",
b"S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf",
b"\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8",
b"Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2",
b"\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s",
b'`\x81O\xdc"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb',
b"\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y",
b"\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08",
b"\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8a",
b"p>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e",
b"\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf",
b"\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16",
)


class AES():
class AES:
"""TinyLoRA AES Implementation
Functions in this implementation are from and/or derived from AES-Python
(https://github.com/bozhu/AES-Python) and TinyLoRa ()
Expand Down Expand Up @@ -96,8 +99,8 @@ def encrypt_payload(self, data):
block_a[8] = self._device_address[1]
block_a[9] = self._device_address[0]
# block from frame counter
block_a[10] = (self.frame_counter & 0x00FF)
block_a[11] = ((self.frame_counter >> 8) & 0x00FF)
block_a[10] = self.frame_counter & 0x00FF
block_a[11] = (self.frame_counter >> 8) & 0x00FF
block_a[12] = 0x00
block_a[13] = 0x00
block_a[14] = 0x00
Expand All @@ -124,10 +127,12 @@ def _aes_encrypt(self, data, key):
:param bytearray data: Data array.
:param bytearray key: Round Key Array.
"""
state = [['0', '0', '0', '0'],
['0', '0', '0', '0'],
['0', '0', '0', '0'],
['0', '0', '0', '0']]
state = [
["0", "0", "0", "0"],
["0", "0", "0", "0"],
["0", "0", "0", "0"],
["0", "0", "0", "0"],
]
# Copy Data to State Array for manipulation
for col in range(4):
for row in range(4):
Expand Down Expand Up @@ -169,9 +174,9 @@ def _aes_calculate_key(self, num_round, round_key):
while num_round != 1:
b = round_const & 0x80
round_const <<= 1
round_const &= 0xff
round_const &= 0xFF
if b == 0x80:
round_const ^= 0x1b
round_const ^= 0x1B
num_round -= 1
# Calculate first temp
tmp_arr[0] = self._aes_sub_byte(round_key[12 + 1])
Expand Down Expand Up @@ -202,8 +207,8 @@ def _aes_sub_byte(sub_byte):
from the AES S_BOX.
:param byte sub_byte: byte to be replaced with S_BOX byte.
"""
row = ((sub_byte >> 4) & 0x0F)
col = (sub_byte & 0x0F)
row = (sub_byte >> 4) & 0x0F
col = sub_byte & 0x0F
return S_BOX[row][col]

def _aes_sub_bytes(self, state):
Expand Down Expand Up @@ -238,9 +243,24 @@ def _aes_shift_rows(arr):
"""AES ShiftRows Step: State array's bytes shifted to the left.
:param bytearray state: State array.
"""
arr[0][1], arr[1][1], arr[2][1], arr[3][1] = arr[1][1], arr[2][1], arr[3][1], arr[0][1]
arr[0][2], arr[1][2], arr[2][2], arr[3][2] = arr[2][2], arr[3][2], arr[0][2], arr[1][2]
arr[0][3], arr[1][3], arr[2][3], arr[3][3] = arr[3][3], arr[0][3], arr[1][3], arr[2][3]
arr[0][1], arr[1][1], arr[2][1], arr[3][1] = (
arr[1][1],
arr[2][1],
arr[3][1],
arr[0][1],
)
arr[0][2], arr[1][2], arr[2][2], arr[3][2] = (
arr[2][2],
arr[3][2],
arr[0][2],
arr[1][2],
)
arr[0][3], arr[1][3], arr[2][3], arr[3][3] = (
arr[3][3],
arr[0][3],
arr[1][3],
arr[2][3],
)

def calculate_mic(self, lora_packet, lora_packet_length, mic):
"""Calculates the validity of data messages, generates a message integrity check bytearray.
Expand All @@ -255,8 +275,8 @@ def calculate_mic(self, lora_packet, lora_packet_length, mic):
block_b[7] = self._device_address[2]
block_b[8] = self._device_address[1]
block_b[9] = self._device_address[0]
block_b[10] = (self.frame_counter & 0x00FF)
block_b[11] = ((self.frame_counter >> 8) & 0x00FF)
block_b[10] = self.frame_counter & 0x00FF
block_b[11] = (self.frame_counter >> 8) & 0x00FF
block_b[15] = lora_packet_length
# calculate num. of blocks and blocksz of last block
num_blocks = lora_packet_length // 16
Expand Down Expand Up @@ -354,7 +374,7 @@ def _shift_left(data):
else:
overflow = 0
# shift 1b left
data[i] = ((data[i] << 1) + overflow)&0xff
data[i] = ((data[i] << 1) + overflow) & 0xFF

@staticmethod
def _xor_data(new_data, old_data):
Expand Down
18 changes: 10 additions & 8 deletions adafruit_tinylora/ttn_as.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
AS920 The Things Network Frequency Plans
* Author(s): Brent Rubell
"""
TTN_FREQS = {0: (0xe6, 0xCC, 0xF4), # 868.1 MHz
1: (0xe6, 0xD9, 0xC0), # 868.3 MHz
2: (0xe6, 0x8C, 0xF3), # 863.5 MHz
3: (0xe6, 0x99, 0xC0), # 867.1 MHz
4: (0xe6, 0xA6, 0x8D), # 867.3 MHz
5: (0xe6, 0xB3, 0x5A), # 867.5 MHz
6: (0xe6, 0xC0, 0x27), # 867.7 MHz
7: (0xe6, 0x80, 0x27)} # 867.9 MHz
TTN_FREQS = {
0: (0xE6, 0xCC, 0xF4), # 868.1 MHz
1: (0xE6, 0xD9, 0xC0), # 868.3 MHz
2: (0xE6, 0x8C, 0xF3), # 863.5 MHz
3: (0xE6, 0x99, 0xC0), # 867.1 MHz
4: (0xE6, 0xA6, 0x8D), # 867.3 MHz
5: (0xE6, 0xB3, 0x5A), # 867.5 MHz
6: (0xE6, 0xC0, 0x27), # 867.7 MHz
7: (0xE6, 0x80, 0x27),
} # 867.9 MHz
18 changes: 10 additions & 8 deletions adafruit_tinylora/ttn_au.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
The Things Network Frequency Plans - AU915
* Author(s): Brent Rubell
"""
TTN_FREQS = {0: (0xe5, 0x33, 0x5a), # 916.8 MHz
1: (0xe5, 0x40, 0x26), # 917.0 MHz
2: (0xe5, 0x4c, 0xf3), # 917.2 MHz
3: (0xe5, 0x59, 0xC0), # 917.4 MHz
4: (0xe5, 0x66, 0x8D), # 917.6 MHz
5: (0xe5, 0x73, 0x5A), # 917.8 MHz
6: (0xe5, 0x80, 0x27), # 918.0 MHz
7: (0xe5, 0x8c, 0xf3)} # 918.2 MHz
TTN_FREQS = {
0: (0xE5, 0x33, 0x5A), # 916.8 MHz
1: (0xE5, 0x40, 0x26), # 917.0 MHz
2: (0xE5, 0x4C, 0xF3), # 917.2 MHz
3: (0xE5, 0x59, 0xC0), # 917.4 MHz
4: (0xE5, 0x66, 0x8D), # 917.6 MHz
5: (0xE5, 0x73, 0x5A), # 917.8 MHz
6: (0xE5, 0x80, 0x27), # 918.0 MHz
7: (0xE5, 0x8C, 0xF3),
} # 918.2 MHz
18 changes: 10 additions & 8 deletions adafruit_tinylora/ttn_eu.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
The Things Network Frequency Plans - EU863
* Author(s): Brent Rubell
"""
TTN_FREQS = {0: (0xd9, 0x06, 0x8b), # 868.1 MHz
1: (0xd9, 0x13, 0x58), # 868.3 MHz
2: (0xd9, 0x20, 0x24), # 868.5 MHz
3: (0xd8, 0xc6, 0x8b), # 867.1 MHz
4: (0xd8, 0xd3, 0x58), # 867.3 MHz
5: (0xd8, 0xe0, 0x24), # 867.5 MHz
6: (0xd8, 0xec, 0xf1), # 867.7 MHz
7: (0xd8, 0xf9, 0xbe)} # 867.9 MHz
TTN_FREQS = {
0: (0xD9, 0x06, 0x8B), # 868.1 MHz
1: (0xD9, 0x13, 0x58), # 868.3 MHz
2: (0xD9, 0x20, 0x24), # 868.5 MHz
3: (0xD8, 0xC6, 0x8B), # 867.1 MHz
4: (0xD8, 0xD3, 0x58), # 867.3 MHz
5: (0xD8, 0xE0, 0x24), # 867.5 MHz
6: (0xD8, 0xEC, 0xF1), # 867.7 MHz
7: (0xD8, 0xF9, 0xBE),
} # 867.9 MHz
18 changes: 10 additions & 8 deletions adafruit_tinylora/ttn_usa.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
The Things Network Frequency Plans - US902
* Author(s): Brent Rubell
"""
TTN_FREQS = {0: (0xE1, 0xF9, 0xC0), # 903.9 MHz
1: (0xE2, 0x06, 0x8C), # 904.1 MHz
2: (0xE2, 0x13, 0x20), # 904.3 MHz
3: (0xE2, 0x20, 0x26), # 904.5 MHz
4: (0xE2, 0x2C, 0xF3), # 904.7 MHz
5: (0xE2, 0x39, 0xc0), # 904.9 MHz
6: (0xE2, 0x46, 0x8c), # 905.1 MHz
7: (0xE2, 0x53, 0x59)} # 905.3 MHz
TTN_FREQS = {
0: (0xE1, 0xF9, 0xC0), # 903.9 MHz
1: (0xE2, 0x06, 0x8C), # 904.1 MHz
2: (0xE2, 0x13, 0x20), # 904.3 MHz
3: (0xE2, 0x20, 0x26), # 904.5 MHz
4: (0xE2, 0x2C, 0xF3), # 904.7 MHz
5: (0xE2, 0x39, 0xC0), # 904.9 MHz
6: (0xE2, 0x46, 0x8C), # 905.1 MHz
7: (0xE2, 0x53, 0x59),
} # 905.3 MHz

0 comments on commit 4a0cb9d

Please sign in to comment.