Skip to content

Commit b040253

Browse files
fix ciphers and padding
1 parent a821de8 commit b040253

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

internal_filesystem/lib/cryptography/hazmat/primitives/ciphers.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@
44
from ucryptolib import aes
55

66
class Cipher:
7+
78
"""Emulates cryptography's Cipher for AES encryption/decryption."""
89
def __init__(self, algorithm, mode):
910
self.algorithm = algorithm
1011
self.mode = mode
1112
self._key = algorithm.key
1213
self._iv = mode.iv if mode.iv is not None else b'\x00' * 16
13-
self._cipher = aes(self._key, 1) # Mode 1 = CBC
14+
self.mode_cbc = 2 # CBC, include IV
15+
#print(f"Cipher init: key length = {len(self._key)} bytes (AES-{len(self._key)*8}), IV = {self._iv.hex()}")
16+
if len(self._key) not in (16, 24, 32):
17+
raise ValueError(f"Invalid key length: {len(self._key)} bytes")
18+
if len(self._iv) != 16:
19+
raise ValueError(f"Invalid IV length: {len(self._iv)} bytes")
20+
self._cipher = aes(self._key, self.mode_cbc, self._iv)
1421

1522
def encryptor(self):
1623
return Encryptor(self._cipher, self._iv)
@@ -27,17 +34,17 @@ def __init__(self, cipher, iv):
2734

2835
def update(self, data):
2936
self._buffer.extend(data)
30-
# MicroPython's ucryptolib processes full blocks
3137
block_size = 16 # AES block size
3238
if len(self._buffer) >= block_size:
3339
to_process = self._buffer[:len(self._buffer) - (len(self._buffer) % block_size)]
3440
self._buffer = self._buffer[len(to_process):]
41+
print(f"Encryptor.update processing: {to_process.hex()}")
3542
return self._cipher.encrypt(to_process)
3643
return b''
3744

3845
def finalize(self):
3946
if self._buffer:
40-
# Pad remaining data if needed (handled by caller with PKCS7)
47+
print(f"Encryptor.finalize processing: {self._buffer.hex()}")
4148
return self._cipher.encrypt(self._buffer)
4249
return b''
4350

@@ -54,11 +61,13 @@ def update(self, data):
5461
if len(self._buffer) >= block_size:
5562
to_process = self._buffer[:len(self._buffer) - (len(self._buffer) % block_size)]
5663
self._buffer = self._buffer[len(to_process):]
64+
#print(f"Decryptor.update processing: {to_process.hex()}")
5765
return self._cipher.decrypt(to_process)
5866
return b''
5967

6068
def finalize(self):
6169
if self._buffer:
70+
#print(f"Decryptor.finalize processing: {self._buffer.hex()}")
6271
return self._cipher.decrypt(self._buffer)
6372
return b''
6473

internal_filesystem/lib/cryptography/hazmat/primitives/padding.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,69 +2,72 @@
22
# Implements PKCS7 padding and unpadding
33

44
def _byte_padding_check(block_size):
5-
"""Validate block size for padding."""
65
if not (0 <= block_size <= 2040):
76
raise ValueError("block_size must be in range(0, 2041).")
87
if block_size % 8 != 0:
98
raise ValueError("block_size must be a multiple of 8.")
109

1110
class PKCS7PaddingContext:
12-
"""Handles PKCS7 padding."""
1311
def __init__(self, block_size):
1412
_byte_padding_check(block_size)
15-
self.block_size = block_size // 8 # Convert bits to bytes
13+
self.block_size = block_size // 8
1614
self._buffer = bytearray()
1715

1816
def update(self, data):
1917
self._buffer.extend(data)
20-
# Return full blocks
2118
block_size = self.block_size
2219
if len(self._buffer) >= block_size:
2320
to_return = self._buffer[:len(self._buffer) - (len(self._buffer) % block_size)]
2421
self._buffer = self._buffer[len(to_return):]
22+
print(f"PKCS7PaddingContext.update returning: {to_return.hex()}")
2523
return to_return
24+
print(f"PKCS7PaddingContext.update buffer: {self._buffer.hex()}")
2625
return b''
2726

2827
def finalize(self):
29-
# Pad with bytes equal to padding length
3028
pad_length = self.block_size - (len(self._buffer) % self.block_size)
3129
padding = bytes([pad_length] * pad_length)
3230
self._buffer.extend(padding)
3331
result = bytes(self._buffer)
32+
print(f"PKCS7PaddingContext.finalize pad_length: {pad_length}, padding: {padding.hex()}, result: {result.hex()}")
3433
self._buffer = bytearray()
3534
return result
3635

3736
class PKCS7UnpaddingContext:
38-
"""Handles PKCS7 unpadding."""
3937
def __init__(self, block_size):
4038
_byte_padding_check(block_size)
4139
self.block_size = block_size // 8
4240
self._buffer = bytearray()
4341

4442
def update(self, data):
4543
self._buffer.extend(data)
46-
# Only process complete blocks
44+
print(f"unpadder self._buffer is {self._buffer.hex()}")
4745
block_size = self.block_size
48-
if len(self._buffer) >= block_size:
49-
to_return = self._buffer[:len(self._buffer) - (len(self._buffer) % block_size)]
46+
# Return all complete blocks except the last one
47+
if len(self._buffer) >= block_size * 2: # At least two blocks
48+
to_return = self._buffer[:len(self._buffer) - block_size]
5049
self._buffer = self._buffer[len(to_return):]
50+
print(f"unpadder self._buffer is now {self._buffer.hex()} and returning {to_return.hex()}")
5151
return to_return
52+
print(f"unpadder self._buffer retained: {self._buffer.hex()}")
5253
return b''
5354

5455
def finalize(self):
56+
print(f"unpadder finalize self._buffer: {self._buffer.hex()}")
5557
if not self._buffer or len(self._buffer) % self.block_size != 0:
56-
raise ValueError("Invalid padding")
58+
raise ValueError(f"Invalid padding A: buffer {self._buffer.hex()}, length {len(self._buffer)}, remainder {len(self._buffer) % self.block_size}")
5759
pad_length = self._buffer[-1]
60+
print(f"unpadder finalize pad_length: {pad_length}, last {pad_length} bytes: {self._buffer[-pad_length:].hex()}")
5861
if pad_length > self.block_size or pad_length == 0:
59-
raise ValueError("Invalid padding")
62+
raise ValueError(f"Invalid padding B: pad_length {pad_length}")
6063
if self._buffer[-pad_length:] != bytes([pad_length] * pad_length):
61-
raise ValueError("Invalid padding")
64+
raise ValueError(f"Invalid padding C: expected {pad_length} bytes of {pad_length:02x}, got {self._buffer[-pad_length:].hex()}")
6265
result = bytes(self._buffer[:-pad_length])
6366
self._buffer = bytearray()
67+
print(f"unpadder finalize result: {result.hex()}")
6468
return result
6569

6670
class PKCS7:
67-
"""PKCS7 padding implementation."""
6871
def __init__(self, block_size):
6972
_byte_padding_check(block_size)
7073
self.block_size = block_size

0 commit comments

Comments
 (0)