Skip to content

Commit 998d523

Browse files
author
Leo Vasanko
committed
Build updated for upstream libaegis 0.9.0 simplified API with matching changes on Python side. Set lower MacOS build target (11.0). Build abi3 version for all supported Python versions, reducing the number of wheels. Other build cleanup.
1 parent ddd0331 commit 998d523

12 files changed

Lines changed: 390 additions & 568 deletions

libaegis

Submodule libaegis updated 64 files

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ package-dir = {"" = "src"}
3737
packages = ["aeg"]
3838

3939
[tool.setuptools.package-data]
40-
aeg = ["*.h", "*.so", "*.pyd"]
40+
aeg = ["*.h"]
4141

4242
[tool.setuptools_scm]

setup.py

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,24 @@
11
"""Setup script for aeg - builds CFFI extension with libaegis C library."""
22

33
import sys
4+
import sysconfig
45
from pathlib import Path
56

67
from cffi import FFI
78
from setuptools import setup
89

9-
# Locate the static library (built by build_backend.py before this runs)
10-
lib_name = "aegis.lib" if sys.platform == "win32" else "libaegis.a"
11-
libaegis_static = Path("libaegis/zig-out/lib") / lib_name
12-
if not libaegis_static.exists():
13-
raise RuntimeError(f"libaegis static library not found at {libaegis_static}")
14-
libaegis_static = str(libaegis_static.resolve())
15-
16-
# Include directory for headers
17-
libaegis_include = Path("libaegis/src/include")
18-
if not libaegis_include.exists():
19-
raise RuntimeError(f"libaegis include directory not found at {libaegis_include}")
20-
include_dirs = [str(libaegis_include)]
21-
22-
# Read the CDEF header
23-
cdef_path = Path(__file__).parent / "src" / "aeg" / "aegis_cdef.h"
24-
cdef_content = cdef_path.read_text(encoding="utf-8")
10+
libaegis_static = Path("libaegis/zig-out/lib") / (
11+
"aegis.lib" if sys.platform == "win32" else "libaegis.a"
12+
)
2513

26-
# Create CFFI builder
2714
ffibuilder = FFI()
28-
ffibuilder.cdef(cdef_content)
15+
ffibuilder.cdef((Path(__file__).parent / "src/aeg/aegis_cdef.h").read_text())
16+
17+
# Free-threaded Python does not support Limited API (abi3)
18+
is_free_threaded = sysconfig.get_config_var("Py_GIL_DISABLED")
2919

30-
# Set the source
3120
ffibuilder.set_source(
32-
"aeg._aegis", # module name
21+
"aeg._aegis",
3322
"""
3423
#include "aegis.h"
3524
#include "aegis128l.h"
@@ -39,11 +28,15 @@
3928
#include "aegis256x2.h"
4029
#include "aegis256x4.h"
4130
""",
42-
include_dirs=include_dirs,
43-
extra_objects=[libaegis_static],
31+
include_dirs=["libaegis/src/include"],
32+
extra_objects=[str(libaegis_static.resolve())],
33+
py_limited_api=not is_free_threaded,
4434
)
4535

4636
if __name__ == "__main__":
4737
setup(
4838
cffi_modules=["setup.py:ffibuilder"],
39+
options=(
40+
{"bdist_wheel": {"py_limited_api": "cp310"}} if not is_free_threaded else {}
41+
),
4942
)

src/aeg/aegis128l.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -708,24 +708,17 @@ def update(
708708
raise TypeError(
709709
"into length must be >= expected output size for this update"
710710
)
711-
written = ffi.new("size_t *")
712711
rc = _lib.aegis128l_state_encrypt_update(
713712
self._state.ptr,
714713
ffi.from_buffer(out_mv),
715-
out_mv.nbytes,
716-
written,
717714
_ptr(message),
718715
message.nbytes,
719716
)
720717
if rc != 0:
721718
err_num = ffi.errno
722719
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
723-
raise RuntimeError(
724-
f"state encrypt update failed: {err_name} written {written[0]}"
725-
)
726-
w = int(written[0])
727-
assert w == expected_out
728-
return out if into is None else memoryview(out)[:w] # type: ignore
720+
raise RuntimeError(f"state encrypt update failed: {err_name}")
721+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
729722

730723
def final(self, into: Buffer | None = None) -> bytearray | memoryview:
731724
"""Finalize encryption and return the authentication tag.
@@ -746,24 +739,17 @@ def final(self, into: Buffer | None = None) -> bytearray | memoryview:
746739
if into is not None:
747740
into = memoryview(into)
748741
out = into if into is not None else bytearray(maclen)
749-
written = ffi.new("size_t *")
750742
rc = _lib.aegis128l_state_encrypt_final(
751743
self._state.ptr,
752744
ffi.from_buffer(out),
753-
memoryview(out).nbytes,
754-
written,
755745
maclen,
756746
)
757747
if rc != 0:
758748
err_num = ffi.errno
759749
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
760750
raise RuntimeError(f"state encrypt final failed: {err_name}")
761-
w = int(written[0])
762-
if into is None:
763-
# Only the tag bytes are returned when we allocate the buffer
764-
assert w == maclen
765751
self._state = None
766-
return out if into is None else memoryview(out)[:w] # type: ignore
752+
return out if into is None else memoryview(out)[:maclen] # type: ignore
767753

768754

769755
class Decryptor:
@@ -837,24 +823,17 @@ def update(self, ct: Buffer, into: Buffer | None = None) -> bytearray | memoryvi
837823
out_mv = memoryview(out)
838824
if out_mv.nbytes < expected_out:
839825
raise TypeError("into length must be >= required capacity for this update")
840-
written = ffi.new("size_t *")
841-
rc = _lib.aegis128l_state_decrypt_detached_update(
826+
rc = _lib.aegis128l_state_decrypt_update(
842827
self._state.ptr,
843828
ffi.from_buffer(out_mv),
844-
out_mv.nbytes,
845-
written,
846829
_ptr(ct),
847830
ct.nbytes,
848831
)
849832
if rc != 0:
850833
err_num = ffi.errno
851834
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
852835
raise RuntimeError(f"state decrypt update failed: {err_name}")
853-
w = int(written[0])
854-
assert w == expected_out, (
855-
f"got {w}, expected {expected_out}, ct.nbytes={ct.nbytes}"
856-
)
857-
return out if into is None else memoryview(out)[:w] # type: ignore
836+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
858837

859838
def final(self, mac: Buffer) -> None:
860839
"""Finalize decryption by verifying the MAC tag.
@@ -873,9 +852,7 @@ def final(self, mac: Buffer) -> None:
873852
mac = memoryview(mac)
874853
if mac.nbytes != maclen:
875854
raise TypeError(f"mac length must be {maclen}")
876-
rc = _lib.aegis128l_state_decrypt_detached_final(
877-
self._state.ptr, ffi.NULL, 0, ffi.NULL, _ptr(mac), maclen
878-
)
855+
rc = _lib.aegis128l_state_decrypt_final(self._state.ptr, _ptr(mac), maclen)
879856
if rc != 0:
880857
raise ValueError("authentication failed")
881858
self._state = None

src/aeg/aegis128x2.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -708,24 +708,17 @@ def update(
708708
raise TypeError(
709709
"into length must be >= expected output size for this update"
710710
)
711-
written = ffi.new("size_t *")
712711
rc = _lib.aegis128x2_state_encrypt_update(
713712
self._state.ptr,
714713
ffi.from_buffer(out_mv),
715-
out_mv.nbytes,
716-
written,
717714
_ptr(message),
718715
message.nbytes,
719716
)
720717
if rc != 0:
721718
err_num = ffi.errno
722719
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
723-
raise RuntimeError(
724-
f"state encrypt update failed: {err_name} written {written[0]}"
725-
)
726-
w = int(written[0])
727-
assert w == expected_out
728-
return out if into is None else memoryview(out)[:w] # type: ignore
720+
raise RuntimeError(f"state encrypt update failed: {err_name}")
721+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
729722

730723
def final(self, into: Buffer | None = None) -> bytearray | memoryview:
731724
"""Finalize encryption and return the authentication tag.
@@ -746,24 +739,17 @@ def final(self, into: Buffer | None = None) -> bytearray | memoryview:
746739
if into is not None:
747740
into = memoryview(into)
748741
out = into if into is not None else bytearray(maclen)
749-
written = ffi.new("size_t *")
750742
rc = _lib.aegis128x2_state_encrypt_final(
751743
self._state.ptr,
752744
ffi.from_buffer(out),
753-
memoryview(out).nbytes,
754-
written,
755745
maclen,
756746
)
757747
if rc != 0:
758748
err_num = ffi.errno
759749
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
760750
raise RuntimeError(f"state encrypt final failed: {err_name}")
761-
w = int(written[0])
762-
if into is None:
763-
# Only the tag bytes are returned when we allocate the buffer
764-
assert w == maclen
765751
self._state = None
766-
return out if into is None else memoryview(out)[:w] # type: ignore
752+
return out if into is None else memoryview(out)[:maclen] # type: ignore
767753

768754

769755
class Decryptor:
@@ -837,24 +823,17 @@ def update(self, ct: Buffer, into: Buffer | None = None) -> bytearray | memoryvi
837823
out_mv = memoryview(out)
838824
if out_mv.nbytes < expected_out:
839825
raise TypeError("into length must be >= required capacity for this update")
840-
written = ffi.new("size_t *")
841-
rc = _lib.aegis128x2_state_decrypt_detached_update(
826+
rc = _lib.aegis128x2_state_decrypt_update(
842827
self._state.ptr,
843828
ffi.from_buffer(out_mv),
844-
out_mv.nbytes,
845-
written,
846829
_ptr(ct),
847830
ct.nbytes,
848831
)
849832
if rc != 0:
850833
err_num = ffi.errno
851834
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
852835
raise RuntimeError(f"state decrypt update failed: {err_name}")
853-
w = int(written[0])
854-
assert w == expected_out, (
855-
f"got {w}, expected {expected_out}, ct.nbytes={ct.nbytes}"
856-
)
857-
return out if into is None else memoryview(out)[:w] # type: ignore
836+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
858837

859838
def final(self, mac: Buffer) -> None:
860839
"""Finalize decryption by verifying the MAC tag.
@@ -873,9 +852,7 @@ def final(self, mac: Buffer) -> None:
873852
mac = memoryview(mac)
874853
if mac.nbytes != maclen:
875854
raise TypeError(f"mac length must be {maclen}")
876-
rc = _lib.aegis128x2_state_decrypt_detached_final(
877-
self._state.ptr, ffi.NULL, 0, ffi.NULL, _ptr(mac), maclen
878-
)
855+
rc = _lib.aegis128x2_state_decrypt_final(self._state.ptr, _ptr(mac), maclen)
879856
if rc != 0:
880857
raise ValueError("authentication failed")
881858
self._state = None

src/aeg/aegis128x4.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -708,24 +708,17 @@ def update(
708708
raise TypeError(
709709
"into length must be >= expected output size for this update"
710710
)
711-
written = ffi.new("size_t *")
712711
rc = _lib.aegis128x4_state_encrypt_update(
713712
self._state.ptr,
714713
ffi.from_buffer(out_mv),
715-
out_mv.nbytes,
716-
written,
717714
_ptr(message),
718715
message.nbytes,
719716
)
720717
if rc != 0:
721718
err_num = ffi.errno
722719
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
723-
raise RuntimeError(
724-
f"state encrypt update failed: {err_name} written {written[0]}"
725-
)
726-
w = int(written[0])
727-
assert w == expected_out
728-
return out if into is None else memoryview(out)[:w] # type: ignore
720+
raise RuntimeError(f"state encrypt update failed: {err_name}")
721+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
729722

730723
def final(self, into: Buffer | None = None) -> bytearray | memoryview:
731724
"""Finalize encryption and return the authentication tag.
@@ -746,24 +739,17 @@ def final(self, into: Buffer | None = None) -> bytearray | memoryview:
746739
if into is not None:
747740
into = memoryview(into)
748741
out = into if into is not None else bytearray(maclen)
749-
written = ffi.new("size_t *")
750742
rc = _lib.aegis128x4_state_encrypt_final(
751743
self._state.ptr,
752744
ffi.from_buffer(out),
753-
memoryview(out).nbytes,
754-
written,
755745
maclen,
756746
)
757747
if rc != 0:
758748
err_num = ffi.errno
759749
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
760750
raise RuntimeError(f"state encrypt final failed: {err_name}")
761-
w = int(written[0])
762-
if into is None:
763-
# Only the tag bytes are returned when we allocate the buffer
764-
assert w == maclen
765751
self._state = None
766-
return out if into is None else memoryview(out)[:w] # type: ignore
752+
return out if into is None else memoryview(out)[:maclen] # type: ignore
767753

768754

769755
class Decryptor:
@@ -837,24 +823,17 @@ def update(self, ct: Buffer, into: Buffer | None = None) -> bytearray | memoryvi
837823
out_mv = memoryview(out)
838824
if out_mv.nbytes < expected_out:
839825
raise TypeError("into length must be >= required capacity for this update")
840-
written = ffi.new("size_t *")
841-
rc = _lib.aegis128x4_state_decrypt_detached_update(
826+
rc = _lib.aegis128x4_state_decrypt_update(
842827
self._state.ptr,
843828
ffi.from_buffer(out_mv),
844-
out_mv.nbytes,
845-
written,
846829
_ptr(ct),
847830
ct.nbytes,
848831
)
849832
if rc != 0:
850833
err_num = ffi.errno
851834
err_name = errno.errorcode.get(err_num, f"errno_{err_num}")
852835
raise RuntimeError(f"state decrypt update failed: {err_name}")
853-
w = int(written[0])
854-
assert w == expected_out, (
855-
f"got {w}, expected {expected_out}, ct.nbytes={ct.nbytes}"
856-
)
857-
return out if into is None else memoryview(out)[:w] # type: ignore
836+
return out if into is None else memoryview(out)[:expected_out] # type: ignore
858837

859838
def final(self, mac: Buffer) -> None:
860839
"""Finalize decryption by verifying the MAC tag.
@@ -873,9 +852,7 @@ def final(self, mac: Buffer) -> None:
873852
mac = memoryview(mac)
874853
if mac.nbytes != maclen:
875854
raise TypeError(f"mac length must be {maclen}")
876-
rc = _lib.aegis128x4_state_decrypt_detached_final(
877-
self._state.ptr, ffi.NULL, 0, ffi.NULL, _ptr(mac), maclen
878-
)
855+
rc = _lib.aegis128x4_state_decrypt_final(self._state.ptr, _ptr(mac), maclen)
879856
if rc != 0:
880857
raise ValueError("authentication failed")
881858
self._state = None

0 commit comments

Comments
 (0)