TurtleGit for Mac

View Markdown source ↗

OpenSSH runtime preparation

The full port needs an app-owned SSH client and private-agent tools for sandboxed Git transports. All Xcode configurations now embed these tools. The existing agent resolver selects bundled agent/add tools. Packaged Git places the bundled SSH directory before its Git/system directories for ordinary SSH lookup. App Store SSH acceptance remains incomplete.

Configuration/OpenSSHRuntime.json pins OpenSSH 10.6p1 and OpenSSL 3.5.9, publisher archive checksums, arm64/x86_64 slices and a macOS 13 deployment target. The source checksums were compared with the OpenSSH release notice and OpenSSL downloads. This is checksum verification, not publisher PGP signature verification.

Build and audit on a Mac with Xcode command-line tools and Python 3:

python3 scripts/build-openssh-runtime.py
python3 scripts/validate-openssh-runtime.py build/openssh-runtime/OpenSSH

The five selected tools are ssh, ssh-agent, ssh-add, ssh-keygen and ssh-keyscan. OpenSSL is statically linked; shared modules, dynamic engines and automatic OpenSSL configuration loading are disabled. PAM, Kerberos, libedit and the built-in FIDO provider are disabled in this preparatory build. PKCS#11 and security-key helper processes, external providers and hardware keys are not packaged or accepted. These are remaining requirements, not a claim of complete TortoiseGit authentication parity.

The output retains original OpenSSH and OpenSSL licenses, complete pinned source archives, the build script and pin configuration under Sources, and a provenance manifest recording every retained file and binary hash, compiler and SDK. The recorded reconstruction command builds from these retained archives. OpenSSH license notices describe BSD and other permissive components; OpenSSL's original Apache 2.0 text is retained. The application license remains unchanged.

The audit checks exact inventory and hashes, both architecture slices, minimum OS and system-only dynamic dependencies. Its runtime fixture uses a private HOME and foreground agent, generates disposable Ed25519/ECDSA/RSA keys, checks loading and removal, and rejects an encrypted key with prompting disabled. It does not use the login agent, contact an SSH server or launch the main application. Runtime execution is on the host architecture; universal slices alone do not prove Intel execution or macOS 13 compatibility.

The local audit record records the fresh build, independent audit and five tamper rejections. Complete rebuilding from the retained reconstruction package has not yet been exercised.

Remaining integration and acceptance

See SSH agent parity and distribution preparation. Successful standalone compilation is not evidence of signed sandbox invocation or App Store submission readiness.

Embedding and signing

embed-openssh-runtime.py audits the unsigned input, stages a private copy and validates it before replacing the app helper directory. With Xcode signing enabled it signs all five tools with hardened runtime options, preserving unsigned hashes and updating both binary and file hashes. AppStore uses GitHelper.entitlements (app-sandbox and inherit). The validator verifies each signature and exact inherited entitlements. It skips runtime execution for inherited helpers because execution must be tested from a signed sandboxed parent. Ad-hoc signing checks establish neither distribution signing nor sandbox behavior. Failed preparation preserves the previous helper directory.

The embedding audit record records both unsigned app builds, their bundle checks and private fixture signing/failure tests. Failed inputs and signing preserve every previous package file hash.

Git client selection

GitRuntime.environment prepends a present executable OpenSSH/bin/ssh directory to packaged Git's PATH. It does not write GIT_SSH_COMMAND, GIT_SSH or Git config, so explicit environment commands and core.sshCommand retain Git precedence. External development Git keeps its existing environment. AppStore executable resolution requires an executable packaged SSH client alongside Git.

Private real-Git fixtures record default and explicitly selected mock clients, including path spaces and private socket forwarding. They stop before any network operation. Signed transports and real authentication remain unverified.

The client-selection audit records real-Git precedence fixtures and a native receiver loading the AppStore bundle's Core. That receiver resolves packaged Git and agent tools, runs Git with a generic ssh -V version-only command, and verifies the bundled OpenSSH/OpenSSL versions. The Git operation ends with the expected failed remote exchange after SSH exits without connecting. This verifies lookup through the built Core; it does not verify authentication. The receiver compiles against matching build-product module metadata because Xcode strips modules from embedded frameworks.

Bundled-agent native checks exercise the real embedded key loader/response helper and monitor the real agent's PID. A private controlled loader delays loading to verify closure and failure cleanup. Both unsigned configurations pass; this does not prove signed execution.

CI reconstruction inventory repair — 2026-10-13

Hosted run 38403636288 stopped before application tests because the builder packaged pinned_download.py but the validator's exact file inventory omitted it. The inventory now includes that reconstruction dependency; checksum and extra-file rejection remain enforced. An actual universal rebuild and runtime validation passed. See the scoped evidence. The subsequent hosted run and signed acceptance remain unverified.