2 Commits
Author SHA1 Message Date
LeoVasanko 503ce8e491 Fix FileStorage on Windows: open fd with O_BINARY, UTF-8 release logs
release / build-wheels (linux, bash) (push) Successful in 1m13s
release / build-wheels (windows, cmd) (push) Successful in 1m20s
release / build-wheels (macos, bash) (push) Successful in 1m26s
release / publish-pypi (push) Failing after 2s
os.open() on Windows defaults to O_TEXT, so the CRT translated \r\n in
binary ciphertext: writes grew, offsets shifted, reads came up short and
the RAF callbacks failed with EIO (probe/read/write depending on where
a 0x0A byte landed). Pass O_BINARY where it exists.

Also reconfigure stdout/stderr to UTF-8 in tools/release.py so the
✓/✗/⚠ summary lines don't crash on cp1252 Windows consoles.
2026-10-04 17:48:34 +00:00
LeoVasanko 59dd4d922f README 2026-10-04 17:35:09 +00:00
3 changed files with 9 additions and 1 deletions

No files matched your search

+1 -1
View File
@@ -125,7 +125,7 @@ Constants (per module): NAME, KEYBYTES, NONCEBYTES, MACBYTES, MACBYTES_LONG, RAT
### Random Generator (CSPRNG)
Seeded once from the OS with random key and nonce, then a cryptographically secure AEGIS keystream: each call increments the nonce, so no output block ever repeats. `random_key()` and `random_nonce()` draw from it. The into variant can directly fill Numpy integer arrays and other structures that support Buffer API, making it far faster than any alternatives (e.g. Numpy's own random module).
Seeded once from the OS, then a cryptographically secure AEGIS keystream with thread local key/nonce making it thread safe. `random_key()` and `random_nonce()` draw from it. The into variant can directly fill Numpy integer arrays and other structures that support Buffer API, making it far faster than any alternatives (e.g. Numpy's own random module).
- random().bytes(n) -> bytearray
- random().into(buffer) -> None
+3
View File
@@ -104,6 +104,9 @@ class FileStorage:
flags = os.O_RDWR | os.O_CREAT | os.O_EXCL
else:
raise ValueError(f"Unsupported mode: {mode}")
# O_BINARY (Windows only): keep the CRT from translating \r\n in
# binary data, which corrupts ciphertext and shifts offsets
flags |= getattr(os, "O_BINARY", 0)
self._fd = os.open(path, flags, 0o644)
self._closed = False
self._lock = threading.Lock()
+5
View File
@@ -305,6 +305,11 @@ def run_benchmark(wheel: Path, py_version: str) -> bool:
def main():
"""Build wheels for all supported Python versions."""
# Windows CI consoles default to cp1252; emit ✓/✗/⚠ as UTF-8
for stream in (sys.stdout, sys.stderr):
if hasattr(stream, "reconfigure"):
stream.reconfigure(encoding="utf-8", errors="replace")
# CI matrix jobs build per-platform wheels but never upload; a separate
# publish job uploads everything once all platforms have succeeded.
no_upload = "--no-upload" in sys.argv