Skip to content

feat(libSceLibreSsl3): implement EVP_CIPHER_nid, BN_is_negative and RSA_bits - #14008

Closed
Appelschorle187 wants to merge 11 commits into
boykopovar:mainfrom
Appelschorle187:feat/libressl3-named-exports
Closed

Appelschorle187 wants to merge 11 commits into
boykopovar:mainfrom
Appelschorle187:feat/libressl3-named-exports

Conversation

@Appelschorle187

Copy link
Copy Markdown

What

Names and implements three libSceLibreSsl3 exports that were placeholders known only by NID. Each name was matched with compute_nid from tools/nid_names.py. The behaviour follows LibreSSL 4.0.0:

  • EVP_CIPHER_nid (aLdgrI2jAF0) returns nid at offset 0 of the 80-byte EVP_CIPHER.
  • BN_is_negative (AiNud8LR8B4) returns neg != 0 from the 24-byte BIGNUM. The new include/Bignum.hpp defines LibreSsl3Bignum.
  • RSA_bits (3KZ-L4y1gak) returns BN_num_bits(n), reading n at offset 24 of the module's existing 152-byte LibreSsl3Rsa layout.

A null argument throws, as do malformed bignums: negative top, null d, or a bit count above INT_MAX. The additional-export inventory goes from 177 entries (126 known only by NID) to 174 (123). Debt entries record that none of this is checked on the console. They also record that the console's RSA layout (offset 24 here, 32 in libSceLibreSsl's LibreSslRsa) is unverified.

Tested

Linux x86-64 (GCC). Built the libSceLibreSsl3 test targets and ran ctest -R "guest_libressl3|guest_crypto_memcmp": 9 of 9 passed, including the new guest_libressl3_bignum and guest_libressl3_rsa, and guest_libressl3_cipher, which now covers EVP_CIPHER_nid. tools/check_conventions.py --base origin/main and test_public_headers.py --audit-only pass. nm -D on the built libSceLibreSsl3.prx shows EVP_CIPHER_nid_nid_postfix, BN_is_negative_nid_postfix and RSA_bits_nid_postfix. No title, Windows or console testing.

The INT_MAX case in tests/Rsa.cpp computes a d pointer through uintptr_t so that d[top - 1] lands on one stack word instead of allocating 256 MiB. This is implementation-defined but holds on flat x86-64 address spaces.

tools/pr_overlap.py lists #10461, #10557, #10631, #10960, #12754, #12928, #12945 and #13662. They share files (Api.hpp, CMakeLists.txt, Key.hpp, AdditionalExports.cpp, the debt file) but none implements these exports.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

🤖 Generated with Claude Code

https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn

Appelschorle187 and others added 11 commits October 31, 2026 16:40
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rhFWQL7oZRJSiGdkL5Gkn

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Tests run and reviewed — approval withheld pending PS5 RSA layout evidence

The implementations match the pinned LibreSSL source model, but the PR leaves the RSA.n layout unverified for the console module and RSA_bits dereferences that field.

What I ran

Reviewed head c6ee4cf150339432043d141947c859c3fd034099 against base 474030e58424fefdb65e5df9f3820810fbb4553c; the exact head has a clean individual merge preview. Environment: Debian Linux 6.1 x86_64, Python 3.11.2, GCC 12.2.0. No project build or C++ test run.

python3 tools/pr_precheck.py --repo boykopovar/AnyPS5 --pr 14008
git diff --check 474030e58424fefdb65e5df9f3820810fbb4553c...c6ee4cf150339432043d141947c859c3fd034099
python3 tools/nid_names.py --name EVP_CIPHER_nid --name BN_is_negative --name RSA_bits
git worktree add --detach /tmp/anyps5-review-14008 c6ee4cf150339432043d141947c859c3fd034099
python3 tools/pr_test_quality.py --root /tmp/anyps5-review-14008 --json core/libs/prx/libSceLibreSsl3/tests/Bignum.cpp core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp core/libs/prx/libSceLibreSsl3/tests/Rsa.cpp
git worktree remove /tmp/anyps5-review-14008
python3 tools/pr_abi_audit.py --repo . --base 474030e58424fefdb65e5df9f3820810fbb4553c --head c6ee4cf150339432043d141947c859c3fd034099 --json
curl -fsSL https://raw.githubusercontent.com/libressl/openbsd/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/rsa/rsa_eay.c | grep -n -A3 -B2 'RSA_bits'
curl -fsSL https://raw.githubusercontent.com/libressl/openbsd/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/rsa/rsa_lib.c | grep -n -A3 -B2 'RSA_bits'
gh pr checks 14008 --repo boykopovar/AnyPS5

I also inspected the exact CMake test registration and the pinned LibreSSL source files cited by the PR.

Results

Check Result
Diff check Passed; no output.
Conventions and PR template Passed on the exact head.
Name/NID mapping All three names match tools/nid_names.py.
Export/declaration audit The three new exports each have one header declaration and one definition. Warnings are the former Unknown_* placeholders removed as the same NIDs are renamed by this PR.
Test registration The heuristic flagged all three test paths as possibly unregistered. Manual inspection confirms they are registered by the library's CMake file; the heuristic does not resolve ${CMAKE_CURRENT_SOURCE_DIR} paths.
Precheck helper availability The exact PR tree predates pr_abi_audit.py and pr_test_quality.py, so the precheck could not invoke those helpers from that checkout. I ran the current local helpers against the exact PR commits instead.
Hosted CI Conventions, intake, and labels passed. No build or C++ test job was present in the check snapshot.
Author-reported tests The PR body reports 9/9 focused Linux tests passed, including the new cipher, bignum, and RSA tests. I did not independently run them.
Local build/tests Not run.
Unedited relevant output

NID mapping:

NAME                                     NID
EVP_CIPHER_nid                           aLdgrI2jAF0
BN_is_negative                           AiNud8LR8B4
RSA_bits                                 3KZ-L4y1gak

ABI audit, filtered to the three new symbols and its findings:

{
  "status": "passed_with_warnings",
  "symbols": [
    {
      "name": "BN_is_negative_nid_postfix",
      "computed_nid": "AiNud8LR8B4",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Bignum.cpp"
      ]
    },
    {
      "name": "EVP_CIPHER_nid_nid_postfix",
      "computed_nid": "aLdgrI2jAF0",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Cipher.cpp"
      ]
    },
    {
      "name": "RSA_bits_nid_postfix",
      "computed_nid": "3KZ-L4y1gak",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Rsa.cpp"
      ]
    }
  ],
  "findings": [
    {
      "symbol": "Unknown_3KZ_minus_L4y1gak_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    },
    {
      "symbol": "Unknown_AiNud8LR8B4_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    },
    {
      "symbol": "Unknown_aLdgrI2jAF0_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    }
  ]
}

Test-quality heuristic:

{
  "findings": [
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Bignum.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."},
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."},
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Rsa.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."}
  ],
  "negative_control_candidates": [],
  "limits": [
    "Heuristics can miss weak assertions and can flag valid tests; inspect every finding.",
    "A test that passes against base is not by itself proof that the PR test is inadequate.",
    "Negative controls are only candidates until the test actually runs against base and fails by assertion rather than import/setup error."
  ]
}

LibreSSL source lookup:

rsa_eay.c
852-RSA_bits(const RSA *r)
853-{
854-    return BN_num_bits(r->n);
855-}
rsa_lib.c
223-RSA_security_bits(const RSA *rsa)
224-{
225-    return BN_security_bits(RSA_bits(rsa), -1);

Negative control

Assertion Change to code under test Did the test fail?
New tests check the reported cipher NID, bignum sign, and RSA modulus bit count. Restore the prior throwing placeholder exports. Not exercised; the exact-head C++ tests require a build, which I did not run.

Findings

Blocking

None confirmed from the inspected source and checks.

Non-blocking

  1. RSA_bits reads rsa->n at offset 24. The cited LibreSSL 4.0.0 rsa_local.h has that layout, but the PR's debt entry explicitly says the PS5 console layout is unverified; the other AnyPS5 LibreSslRsa model places n at offset 32 because it includes an engine field. This is a material ABI uncertainty, so I am withholding approval rather than treating the upstream layout as console evidence. Please provide evidence that the exact libSceLibreSsl3 RSA object uses offset 24, or keep RSA_bits throwing until that layout is established.
  2. The debt entry links the RSA_bits behavior to rsa_lib.c, but the function body is in the pinned LibreSSL rsa_eay.c; rsa_lib.c only calls RSA_bits from RSA_security_bits. Please correct the source link.

Sources

Not verified

I did not build the PR or run its C++ tests, Windows tests, a title, or console behavior. The 9/9 test result is author-reported. In particular, I could not verify that the console's libSceLibreSsl3 RSA object matches the upstream structure at offset 24.

To get this to a good state

Add evidence for the console RSA layout at offset 24 (or leave that export throwing), and correct the RSA_bits source link. I will reassess the same checks on the updated head.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Tests run and reviewed — approval withheld pending PS5 RSA layout evidence

The implementations match the pinned LibreSSL source model, but the PR leaves the RSA.n layout unverified for the console module and RSA_bits dereferences that field.

What I ran

Reviewed head c6ee4cf150339432043d141947c859c3fd034099 against base 474030e58424fefdb65e5df9f3820810fbb4553c; the exact head has a clean individual merge preview. Environment: Debian Linux 6.1 x86_64, Python 3.11.2, GCC 12.2.0. No project build or C++ test run.

python3 tools/pr_precheck.py --repo boykopovar/AnyPS5 --pr 14008
git diff --check 474030e58424fefdb65e5df9f3820810fbb4553c...c6ee4cf150339432043d141947c859c3fd034099
python3 tools/nid_names.py --name EVP_CIPHER_nid --name BN_is_negative --name RSA_bits
git worktree add --detach /tmp/anyps5-review-14008 c6ee4cf150339432043d141947c859c3fd034099
python3 tools/pr_test_quality.py --root /tmp/anyps5-review-14008 --json core/libs/prx/libSceLibreSsl3/tests/Bignum.cpp core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp core/libs/prx/libSceLibreSsl3/tests/Rsa.cpp
git worktree remove /tmp/anyps5-review-14008
python3 tools/pr_abi_audit.py --repo . --base 474030e58424fefdb65e5df9f3820810fbb4553c --head c6ee4cf150339432043d141947c859c3fd034099 --json
curl -fsSL https://raw.githubusercontent.com/libressl/openbsd/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/rsa/rsa_eay.c | grep -n -A3 -B2 'RSA_bits'
curl -fsSL https://raw.githubusercontent.com/libressl/openbsd/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/rsa/rsa_lib.c | grep -n -A3 -B2 'RSA_bits'
gh pr checks 14008 --repo boykopovar/AnyPS5

I also inspected the exact CMake test registration and the pinned LibreSSL source files cited by the PR.

Results

Check Result
Diff check Passed; no output.
Conventions and PR template Passed on the exact head.
Name/NID mapping All three names match tools/nid_names.py.
Export/declaration audit The three new exports each have one header declaration and one definition. Warnings are the former Unknown_* placeholders removed as the same NIDs are renamed by this PR.
Test registration The heuristic flagged all three test paths as possibly unregistered. Manual inspection confirms they are registered by the library's CMake file; the heuristic does not resolve ${CMAKE_CURRENT_SOURCE_DIR} paths.
Precheck helper availability The exact PR tree predates pr_abi_audit.py and pr_test_quality.py, so the precheck could not invoke those helpers from that checkout. I ran the current local helpers against the exact PR commits instead.
Hosted CI Conventions, intake, and labels passed. No build or C++ test job was present in the check snapshot.
Author-reported tests The PR body reports 9/9 focused Linux tests passed, including the new cipher, bignum, and RSA tests. I did not independently run them.
Local build/tests Not run.
Unedited relevant output

NID mapping:

NAME                                     NID
EVP_CIPHER_nid                           aLdgrI2jAF0
BN_is_negative                           AiNud8LR8B4
RSA_bits                                 3KZ-L4y1gak

ABI audit, filtered to the three new symbols and its findings:

{
  "status": "passed_with_warnings",
  "symbols": [
    {
      "name": "BN_is_negative_nid_postfix",
      "computed_nid": "AiNud8LR8B4",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Bignum.cpp"
      ]
    },
    {
      "name": "EVP_CIPHER_nid_nid_postfix",
      "computed_nid": "aLdgrI2jAF0",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Cipher.cpp"
      ]
    },
    {
      "name": "RSA_bits_nid_postfix",
      "computed_nid": "3KZ-L4y1gak",
      "declarations": [
        "core/libs/prx/libSceLibreSsl3/include/Api.hpp"
      ],
      "definitions": [
        "core/libs/prx/libSceLibreSsl3/src/Rsa.cpp"
      ]
    }
  ],
  "findings": [
    {
      "symbol": "Unknown_3KZ_minus_L4y1gak_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    },
    {
      "symbol": "Unknown_AiNud8LR8B4_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    },
    {
      "symbol": "Unknown_aLdgrI2jAF0_nid_no_patch",
      "kind": "export-removed",
      "message": "This APS5_VABI declaration, definition, or explicit alias appeared in the changed base files but not in the corresponding head files; verify that removing it is intentional."
    }
  ]
}

Test-quality heuristic:

{
  "findings": [
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Bignum.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."},
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."},
    {"path":"core/libs/prx/libSceLibreSsl3/tests/Rsa.cpp","line":1,"kind":"possible-unregistered-cpp-test","message":"Changed C++ test source path was not found literally in CMake files; inspect registration, generated source lists, and workflow coverage."}
  ],
  "negative_control_candidates": [],
  "limits": [
    "Heuristics can miss weak assertions and can flag valid tests; inspect every finding.",
    "A test that passes against base is not by itself proof that the PR test is inadequate.",
    "Negative controls are only candidates until the test actually runs against base and fails by assertion rather than import/setup error."
  ]
}

LibreSSL source lookup:

rsa_eay.c
852-RSA_bits(const RSA *r)
853-{
854-    return BN_num_bits(r->n);
855-}
rsa_lib.c
223-RSA_security_bits(const RSA *rsa)
224-{
225-    return BN_security_bits(RSA_bits(rsa), -1);

Negative control

Assertion Change to code under test Did the test fail?
New tests check the reported cipher NID, bignum sign, and RSA modulus bit count. Restore the prior throwing placeholder exports. Not exercised; the exact-head C++ tests require a build, which I did not run.

Findings

Blocking

None confirmed from the inspected source and checks.

Non-blocking

  1. RSA_bits reads rsa->n at offset 24. The cited LibreSSL 4.0.0 rsa_local.h has that layout, but the PR's debt entry explicitly says the PS5 console layout is unverified; the other AnyPS5 LibreSslRsa model places n at offset 32 because it includes an engine field. This is a material ABI uncertainty, so I am withholding approval rather than treating the upstream layout as console evidence. Please provide evidence that the exact libSceLibreSsl3 RSA object uses offset 24, or keep RSA_bits throwing until that layout is established.
  2. The debt entry links the RSA_bits behavior to rsa_lib.c, but the function body is in the pinned LibreSSL rsa_eay.c; rsa_lib.c only calls RSA_bits from RSA_security_bits. Please correct the source link.

Sources

Not verified

I did not build the PR or run its C++ tests, Windows tests, a title, or console behavior. The 9/9 test result is author-reported. In particular, I could not verify that the console's libSceLibreSsl3 RSA object matches the upstream structure at offset 24.

To get this to a good state

Add evidence for the console RSA layout at offset 24 (or leave that export throwing), and correct the RSA_bits source link. I will reassess the same checks on the updated head.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@Appelschorle187 Please fix RSA_bits to follow the pinned LibreSSL 4.0.0 BN_num_bits behavior for padded words. BN_num_bits delegates to bn_bitsize in bn/bn_primitives.c, which scans the words and finds the highest nonzero one. For d = {1, 0}, top = 2, this PR returns 64 instead of 1; for {0, 0}, top = 2, it returns 64 instead of 0. Please add both regressions.

Please replace the forged d pointer in TestMalformed with valid backing storage or a bounded arithmetic test. Reading all words, as the reference does, would access invalid memory in that fixture. Use the public bignum type for the RSA test objects. Also correct the RSA_bits debt citation: its definition is in rsa/rsa_eay.c at the pinned revision, not rsa_lib.c.

@github-actions

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 10452 docs/dev/debt/libSceLibreSsl3.md L16-17
PR 10490 docs/dev/debt/libSceLibreSsl3.md L16-17
PR 10491 docs/dev/debt/libSceLibreSsl3.md L16-17
PR 10493 docs/dev/debt/libSceLibreSsl3.md L16-17
PR 13831 core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp L260-265, L355-360, L580-585
core/libs/prx/libSceLibreSsl3/include/Api.hpp L155-172, L182-192, L207-254
docs/dev/debt/libSceLibreSsl3.md L37-38, L64-65, L125-135
BN_is_negative
EVP_CIPHER_nid
RSA_bits

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 9970 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
docs/dev/debt/libSceLibreSsl3.md
PR 10461 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 10557 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 10631 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 10960 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 12754 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
core/libs/prx/libSceLibreSsl3/include/Key.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 12928 core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 12945 core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
core/libs/prx/libSceLibreSsl3/include/Key.hpp
docs/dev/debt/libSceLibreSsl3.md
PR 13662 core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp
core/libs/prx/libSceLibreSsl3/CMakeLists.txt
core/libs/prx/libSceLibreSsl3/include/Api.hpp
docs/dev/debt/libSceLibreSsl3.md

CodingBreadd added a commit to CodingBreadd/AnyPS5 that referenced this pull request Oct 31, 2026
…ments unnamed

BN_is_negative, EVP_CIPHER_nid and RSA_bits keep their NID aliases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

3 participants