LibraryPaths.fromReleaseArchive()andReleaseArchiveStrategyfor loading from a liboqs-binaries v2.0.0+ combined archive (per-platform, per-architecture subfolders:linux/x86_64/,android/<abi>/, etc.).releaseArchiveRootparameter onLibOQSLoader.loadLibrary().
LibraryPaths.fromBinaryRoot(),BinaryReleaseStrategy, and thebinaryRootparameter onloadLibrary(). These assumed a combined archive layout that liboqs-binaries never actually produced. No behavior change — usefromReleaseArchive()/releaseArchiveRootinstead.
- Aligned with
liboqs 0.16.0. Native binaries must be upgraded to0.16.xto match. - FrodoKEM naming change:
FrodoKEM-640-AES,FrodoKEM-976-AES,FrodoKEM-1344-AES(and-SHAKEvariants) now refer to the new salted FrodoKEM, suitable for keypairs reused across many encapsulations. The previous ephemeral (one-shot) behavior is now undereFrodoKEM-640-AES,eFrodoKEM-976-AES,eFrodoKEM-1344-AES, etc. Code that hardcoded the old names will keep running but silently get different security properties — check which variant your usage actually needs. - SPHINCS+ removed upstream.
getSupportedSignatureAlgorithms()will no longer list it;Signature.create()/isSupported()will report it unavailable. Migrate to ML-DSA or Falcon.
- Regenerated
liboqs_bindings.dartagainstliboqs 0.16.0headers. - Bumped
ffito^2.2.0. - Updated README
- No changes to the Dart-facing API surface (
KEM,Signature,OQSRandom,LibOQSLoader) — algorithm and struct handling remain runtime-discovered, so existing calling code is unaffected apart from the FrodoKEM/SPHINCS+ algorithm-name changes above.
- Applied public algorithm-name validation consistently in
KEM.create(),KEM.isSupported(),Signature.create(), andSignature.isSupported().
LibOQSUtils.freeSecure()for cryptographic memory cleansing usingOQS_MEM_cleanse.- Added
dispose()methods toKEMKeyPair,SignatureKeyPair, andKEMEncapsulationResultfor best-effort clearing of secret data in the Dart heap. - New
Heap Hygienetest suite insafety_validation_test.dart.
- Fixed critical security issue: Private keys and shared secrets are now securely zeroed in native memory before being freed.
- Fixed potential memory leaks by using
try-finallyblocks for all native pointer allocations. - Optimized
LibOQSUtils.pointerToUint8List()by usingsetRange()instead ofsublist(), reducing redundant memory copies. - Fixed type errors and improved null-safety in
SignatureandKEMimplementations. - Fixed logic error in
deterministic_key_generation_example.dartwhere public keys were printed as a tuple instead of being compared.
- Updated all examples to demonstrate secure resource management and
try-finallypatterns.
- Integrated recommendation to use
OQS_MEM_cleansefor bypassing compiler optimizations when clearing sensitive material. - Enforced heap symmetry for native memory operations to prevent potential heap corruption on Windows.
- Enabled
package:lints/recommended.yamlinanalysis_options.yaml.
- Fixed minor lint issues in
lib/src/random.dartregarding curly braces in flow control.
OQSRandom.generateIntnow uses rejection sampling to eliminate modulo bias. Previously, values in the lower portion of the range were slightly more likely when the byte range did not evenly dividemax - min.OQSRandomExtensions.generateDoubleno longer risks signed 64-bit integer overflow when assembling random bytes. The value is now built from two unsigned 32-bit halves before conversion, ensuring a correct uniform distribution in [0, 1).Signature.signnow frees thesignatureLengthpointer correctly without an unnecessary cast.
KEM.getSupportedKemAlgorithmsHardCodedList()is deprecated. UseKEM.getSupportedKemAlgorithms()directly.Signature.getSupportedSignatureAlgorithmsHardCodedList()is deprecated. UseSignature.getSupportedSignatureAlgorithms()directly.- Commented distro-specific GCC include paths from
ffigencompiler-optsinpubspec.yaml. Contributors on Fedora/RHEL who regenerate bindings may need to add their local GCC path (e.g.-I/usr/lib/gcc/x86_64-redhat-linux/15/include) to a localpubspec_overrides.yamlor pass it directly todart run ffigen.
- Linux ARM64 (aarch64) architecture support with automatic detection
linuxX64andlinuxArm64fields inLibraryPathsfor explicit Linux architecture configuration- Architecture-separated binary layout support for combined all-platforms archives
- Android ABI-specific subdirectories in combined archive structure (
android/<abi>/liboqs.so)
LibraryPaths.fromBinaryRoot()now expects architecture-separated layout:lib/x86_64/liboqs.sofor Linux x86_64lib/aarch64/liboqs.sofor Linux ARM64android/<abi>/liboqs.sofor Android binaries
BinaryReleaseStrategyautomatically detects Linux architecture viauname -m- Combined binary archives no longer overwrite multi-architecture libraries
linuxparameter inLibraryPathsconstructor (uselinuxX64instead;linuxstill works as alias)
- Multi-architecture Linux support (x86_64 and ARM64 no longer overwrite each other)
- Android ABI-specific loading in combined all-platforms archives
- Binary release archive structure to preserve all platform binaries
- Old
linuxparameter still works (maps tolinuxX64automatically) - Apps using individual platform archives are unaffected
- Apps using combined archive should re-download latest release with fixed structure
- To migrate existing code using
linux, optionally replace withlinuxX64for clarity
- Reduced pub.dev analyzer noise from generated FFI bindings by adding a
ffigenpreamble that ignoresunused_elementandunused_fieldinlib/src/bindings/liboqs_bindings.dart. - Regenerated bindings so
dart pub publish --dry-runno longer reports generated-code analyzer warnings.
- Improved analyzer hygiene for better package quality scoring.
- Added
analysis_options.yamland excluded generated FFI bindings from analyzer noise. - Updated examples to use non-deprecated loader configuration (
LibOQSLoader.customPaths+LibraryPaths). - Cleaned minor lint issues in examples/tests.
dart analyzenow reports no issues in the package source/test/example set.
- Expanded
README.mdinto a practical loading guide forliboqsintegration. - Documented exact dynamic library loading strategy precedence used by
LibOQSLoader. - Added platform-specific auto-path selection details (including Android ABI and iOS static linking behavior).
- Added cache behavior and debugging workflow for resolving load failures consistently.
- Migrated runtime behavior and tests to
liboqs0.15.0bindings. - Removed reliance on hard-coded algorithm lists for public API discovery paths.
- Updated behavior assumptions for algorithm availability and key/signature sizes; these are now resolved from the loaded
liboqsbuild at runtime.
- Switched KEM operations to stable top-level
liboqscalls:OQS_KEM_keypair_derandOQS_KEM_keypairOQS_KEM_encapsOQS_KEM_decaps
- Switched signature operations to stable top-level
liboqscalls:OQS_SIG_keypairOQS_SIG_signOQS_SIG_verify
LibOQS.getSupportedKEMAlgorithms()andLibOQS.getSupportedSignatureAlgorithms()now rely on runtime enumeration fromliboqs.
- Resolved FFI instability from direct struct function-pointer invocation by using exported function entry points.
- Updated tests to avoid brittle
0.14.xassumptions (fixed algorithm names/sizes) and use capability-based selection.
- Ensure native library version is
liboqs >= 0.15.0. - If your app assumes specific algorithm names (e.g. only
Kyber*/Dilithium*), move to runtime checks with:LibOQS.getSupportedKEMAlgorithms()LibOQS.getSupportedSignatureAlgorithms()
- Avoid hard-coding key/signature lengths; read them from the created
KEM/Signatureinstance.
- Per-platform library path configuration via
LibraryPathsclass LibraryPaths.fromBinaryRoot()factory for binary release integrationLibraryPaths.fromExtractedArchives()factory for separate platform archivesbinaryRootparameter toloadLibrary()for extracted release directories- iOS XCFramework support with
DynamicLibrary.process()static linking - Android ABI auto-detection from
Platform.version - Better error messages showing all attempted loading strategies
- Improved library loading with more fallback strategies
- Enhanced
PackageRelativeStrategyto check binary release structure - Updated iOS loading to use static linking instead of dynamic library
LibOQSLoader.customPath- useLibOQSLoader.customPathsinstead
- iOS library loading (was incorrectly trying to load
.dylib) - Android loading efficiency with ABI detection
- Memory safety in pointer operations with chunk-based copying
- Custom library path option via
LibOQSLoader.customPathfor more flexible loading.