Skip to content

Add typing: asn, exceptions, hashes, pwdbased, utils.#125

Open
roberthdevries wants to merge 8 commits into
wolfSSL:masterfrom
roberthdevries:add-more-typing
Open

Add typing: asn, exceptions, hashes, pwdbased, utils.#125
roberthdevries wants to merge 8 commits into
wolfSSL:masterfrom
roberthdevries:add-more-typing

Conversation

@roberthdevries

Copy link
Copy Markdown
Contributor

No description provided.

@roberthdevries roberthdevries force-pushed the add-more-typing branch 2 times, most recently from 65d14db to 1c2b082 Compare May 23, 2026 14:02
@Trooper-X

Copy link
Copy Markdown

This also adds the ruff and ty dependencies.
Would be nice if this MR gets merged.

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skoll Code Review

Scan type: reviewOverall recommendation: REQUEST_CHANGES
Findings: 7 total — 7 posted, 0 skipped
6 finding(s) posted as inline comments (see file-level comments below)

Posted findings

  • [High] AES-SIV single-block associated-data length uses char count of original input, not encoded byte lengthwolfcrypt/ciphers.py:397-400
  • [Medium] sign_with_seed no longer accepts bytearray/memoryview seeds (regression)wolfcrypt/ciphers.py:2513-2546
  • [Medium] make_key_from_seed now silently UTF-8-encodes a str seed instead of rejecting itwolfcrypt/ciphers.py:2360-2367
  • [Low] ChaCha init renamed size to _size, breaking the documented backward-compatible keywordwolfcrypt/ciphers.py:544
  • [Low] HKDF helpers annotate hash_cls as instance type instead of class typewolfcrypt/hkdf.py:33,78,105
  • [Low] Random no longer nulls native_object on init failure; del frees an uninitialized RNGwolfcrypt/random.py:37-52
  • [Low] RsaPublic.init made key a required positional argumentwolfcrypt/ciphers.py:771-774

Review generated by Skoll

Comment thread wolfcrypt/ciphers.py
Comment thread wolfcrypt/ciphers.py
Comment thread wolfcrypt/ciphers.py
Comment thread wolfcrypt/ciphers.py Outdated
Comment thread wolfcrypt/random.py Outdated
Comment thread wolfcrypt/ciphers.py
This has some fallout in random.py to simplify checks.
Also one test is slightly adapted to produced the desired failure.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skoll Code Review

Scan type: reviewOverall recommendation: REQUEST_CHANGES
Findings: 7 total — 7 posted, 0 skipped
4 finding(s) posted as inline comments (see file-level comments below)

Posted findings

  • [High] New undeclared runtime dependency on typing_extensionswolfcrypt/ciphers.py:28, wolfcrypt/hashes.py:28
  • [Medium] Removed _ffi.from_buffer() drops bytearray/memoryview support for seed/rand inputswolfcrypt/ciphers.py:2383, 2548, 2559, 2067, 2110
  • [Medium] **_Cipher.new() dropped kwargs, breaking PEP 272 extra keyword argumentswolfcrypt/ciphers.py:187-199
  • [Medium] HKDF functions annotate hash_cls as instance type instead of class typewolfcrypt/hkdf.py:33, 78, 105
  • [Medium] asn.py leaves function arguments unannotated while enabling ANN ruff ruleswolfcrypt/asn.py:81, 99
  • [Low] test_mldsa now relies on cffi's low-level TypeError instead of an explicit guardtests/test_mldsa.py:186
  • [Low] RsaPublic.init made key a required positional argumentwolfcrypt/ciphers.py:781

Review generated by Skoll

Comment thread wolfcrypt/ciphers.py
Comment thread wolfcrypt/asn.py Outdated
Comment thread tests/test_mldsa.py Outdated
Comment thread wolfcrypt/ciphers.py
Tests are now also type checked as this helps verifying the correctness
of the type annotations.
@dgarske dgarske self-requested a review June 11, 2026 20:50

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skoll Code Review

Scan type: reviewOverall recommendation: COMMENT
Findings: 3 total — 3 posted, 0 skipped
3 finding(s) posted as inline comments (see file-level comments below)

Posted findings

  • [Medium] ML-DSA seed handling: bytearray/memoryview now rejected, and the two seed methods validate inconsistentlywolfcrypt/ciphers.py:2371-2392 (make_key_from_seed), 2516-2540 (sign_with_seed)
  • [Low] *ML-KEM _with_random helpers no longer accept bytearray/memoryview for randwolfcrypt/ciphers.py:2059-2077 (encapsulate_with_random), 2103-2119 (make_key_with_random)
  • [Low] hkdf.py forces a runtime import of _Hmac for a type annotation (no from future import annotations)wolfcrypt/hkdf.py:30-33

Review generated by Skoll

Comment thread wolfcrypt/ciphers.py
Comment thread wolfcrypt/hkdf.py
Comment thread wolfcrypt/ciphers.py

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skoll Code Review

Scan type: reviewOverall recommendation: COMMENT
Findings: 4 total — 4 posted, 0 skipped
4 finding(s) posted as inline comments (see file-level comments below)

Posted findings

  • [Medium] ML-DSA seed validation now rejects bytearray/memoryview (regression)wolfcrypt/ciphers.py:2383,2537
  • [Medium] Advertised list/tuple seed support is untested and likely fails at the cffi boundarywolfcrypt/ciphers.py:2372,2391
  • [Low] setup.py install_requires not synced with new typing-extensions runtime dependencysetup.py:62-63
  • [Low] Hard runtime import of private cffi symbol _cffi_backend.Lib only to satisfy a castwolfcrypt/__init__.py:20-22,56

Review generated by Skoll

Comment thread wolfcrypt/ciphers.py Outdated
Comment thread wolfcrypt/ciphers.py Outdated
Comment thread setup.py Outdated
Comment thread wolfcrypt/__init__.py Outdated

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #125 (review)
If you disagree just make note. We are getting close on this and thank you for your efforts

Also added a line to the change log to mention that typing information
has been added.
dgarske
dgarske previously approved these changes Jun 22, 2026
@dgarske dgarske assigned dgarske and unassigned roberthdevries Jun 22, 2026

@dgarske dgarske left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skoll Code Review

Scan type: reviewOverall recommendation: COMMENT
Findings: 4 total — 4 posted, 0 skipped
4 finding(s) posted as inline comments (see file-level comments below)

Posted findings

  • [Medium] typing-extensions dependency has no minimum version (override requires =4.4.0)pyproject.toml:27
  • [Low] bytes(seed) silently accepts an int, dropping the friendly type check for ML-DSA seedswolfcrypt/ciphers.py:2383,2536
  • [Info] New module wolfcrypt/types.py shadows the stdlib types module namewolfcrypt/types.py:1
  • [Info] Inconsistent # ty:ignore comment lacks the space used everywhere elsewolfcrypt/__init__.py:53

Review generated by Skoll

Comment thread pyproject.toml Outdated
dynamic = ["version"]
dependencies = [
"cffi>=1.0.0,<2",
"typing-extensions",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [Medium] typing-extensions dependency has no minimum version (override requires =4.4.0)

The PR adds from typing_extensions import override as an unconditional runtime import in wolfcrypt/ciphers.py and wolfcrypt/hashes.py. override was only added to typing_extensions in 4.4.0 (and typing.override does not exist until Python 3.12, while this package now supports 3.10/3.11 per requires-python = ">=3.10"). The new dependency is declared as just "typing-extensions" with no version floor. On an environment that already has an older typing_extensions installed, pip will treat the unconstrained requirement as already satisfied and not upgrade it, so from typing_extensions import override raises ImportError and the entire wolfcrypt package fails to import.

Fix: Pin a minimum version (typing-extensions>=4.4.0) so override is guaranteed to be importable on all supported Python versions.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment thread wolfcrypt/ciphers.py
@@ -2316,35 +2379,31 @@ def make_key_from_seed(cls, mldsa_type, seed):
:type seed: bytes
"""
mldsa_priv = cls(mldsa_type)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 [Low] bytes(seed) silently accepts an int, dropping the friendly type check for ML-DSA seeds

The previous code wrapped the seed in memoryview(seed) inside a try/except that raised a clear TypeError("seed must support the buffer protocol, such as bytesorbytearray") for non-buffer inputs. The new code replaces that with seed = bytes(seed). For str/None this still raises TypeError (acceptable), but for an int argument bytes(n) silently produces n zero bytes. If a caller mistakenly passes the integer seed length (e.g. make_key_from_seed(t, 32)), the length check len(seed) != ML_DSA_KEYGEN_SEED_LENGTH passes and an all-zero deterministic seed is used to generate a key/signature with no error -- a subtle footgun for a cryptographic seed input. The original explicit, descriptive error message is also lost.

Fix: Reject int (and other non-buffer scalar) inputs explicitly, or restore a buffer-protocol type check, so a misused integer cannot be silently coerced into an all-zero seed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restored the buffer protocol check using memoryview without using the result of memoryview.
Instead the conversion to bytes will take care of passing the right datatype to the cffi wrapped function.

Comment thread wolfcrypt/types.py Outdated
@@ -0,0 +1,35 @@
# types.py

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ [Info] New module wolfcrypt/types.py shadows the stdlib types module name

The PR introduces wolfcrypt/types.py. It is consumed only via package-relative imports (from .types import ...), and Python 3 absolute imports prevent it from shadowing the stdlib types module elsewhere, so there is no runtime bug. However, naming a module types is a well-known footgun for maintainability (any future import types inside the package can confuse readers/tools).

Fix: Consider renaming the module to avoid colliding with the stdlib types name; optional, no functional impact.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed to wc_types.py

Comment thread wolfcrypt/__init__.py Outdated
if hasattr(_lib, 'WC_RNG_SEED_CB_ENABLED'):
if _lib.WC_RNG_SEED_CB_ENABLED:
ret = _lib.wc_SetSeed_Cb(_ffi.addressof(_lib, "wc_GenerateSeed"))
ret = _lib.wc_SetSeed_Cb(_ffi.addressof(_lib, "wc_GenerateSeed")) # ty:ignore[no-matching-overload]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ [Info] Inconsistent # ty:ignore comment lacks the space used everywhere else

Every other suppression added in this PR uses the form # ty: ignore[...] (with a space after the colon), but this one is written # ty:ignore[no-matching-overload] (no space). If the ty checker's comment parser requires the canonical # ty: ignore spelling, this suppression will not take effect and the overload diagnostic will still surface. Cosmetic/tooling only -- no runtime impact.

Fix: Normalize to # ty: ignore[no-matching-overload] to match the rest of the codebase and ensure the suppression is recognized.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@dgarske dgarske assigned roberthdevries and unassigned dgarske Jun 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants