# yubisigner-cli Command-line version of [yubisigner](https://github.com/Ch1ffr3punk/yubisigner) by Stefan Claas, for signing files with YubiKey PIV Ed25519 keys. ## What is this? This is a CLI tool extracted from the original yubisigner GUI application. It provides the same cryptographic signing functionality but in a command-line interface suitable for scripting and automation. ## Why CLI? The original yubisigner is a Fyne GUI application. To integrate YubiKey PIV signing with automated workflows like NeoMutt mail2news posting, a CLI version was needed. ## How it was created This tool was created by extracting the core signing logic from the original `yubisigner.go`: ### Extracted functions (with original line references) | Function | Original lines | Purpose | |----------|---------------|---------| | `normalizeToCRLF` | 538-544 | RFC-compliant line ending normalization | | `ensureUTF8` | 547-552 | UTF-8 validation and sanitization | | `calculateHashesRAM` | 1621-1640 | Calculate 4 hashes (RIPEMD-256, SHA-256, SM3, Streebog-256) | | `formatHashes` | 1746-1766 | Format hashes with right-aligned names | | `formatSignatureRFC` | 1996-2007 | Format signature with 64-char line breaks | | `openYubiKey` | 2073-2092 | Open YubiKey at specified index | | `signEd25519Data` | 1843-1862 | Sign data with Ed25519 (PIV slot 9c) | | `signDataInternal` | 1769-1840 | Main signing workflow (Ed25519 only) | ### Constants preserved - `Ed25519SignatureSize`, `Ed25519PublicKeySize`, `Ed25519CombinedSize` (lines 95-99) - `AlgorithmED25519` (lines 69-73) ### Changes from original 1. **GUI removed**: All Fyne GUI code stripped out 2. **Ed25519 only**: Only Ed25519 support (original supports ECDSA/RSA too) 3. **CLI flags**: Added flag parsing for command-line arguments 4. **No PKCS#11**: Direct YubiKey PIV access only (no PKCS#11 smartcard support) 5. **Simplified output**: Direct signature file write (no GUI dialogs) The core cryptographic logic is **exactly the same** as the original yubisigner. All signing functions are verbatim copies with comments indicating source line numbers. ## Requirements - Go 1.21+ - YubiKey with PIV Ed25519 key in slot 9c (Signature slot) - Dependencies: - `github.com/go-piv/piv-go/v2/piv` - `github.com/c0mm4nd/go-ripemd` - `github.com/martinlindhe/gogost/gost34112012256` - `github.com/tjfoc/gmsm/sm3` ## Build ```bash go build -o yubisigner-cli main.go ``` ## Usage ```bash yubisigner-cli \ --input \ --author "Your Name" \ --email "you@example.com" \ --url "https://example.com" \ --comment "Optional comment" ``` Output: `.sig` (detached signature) ### Optional arguments - `--email` (default: "n/a") - `--url` (default: "n/a") - `--telefax` (default: "n/a") - `--comment` (default: "n/a") - `--pin` (PIN will be prompted if not provided) - `--output` (default: `.sig`) ## Signature format Identical to original yubisigner: ``` Author: Gab Virebent Signed at: 2026-05-30 23:15:00 +0000 Filename: message.txt File size: 1234 bytes Email: gabriel1@virebent.art Telefax: n/a URL: https://contact.virebent.art Comment: Posted via NeoMutt mail2news RIPEMD-256: abc123... SHA-256: def456... SM3: 789abc... Streebog-256: fedcba... -----BEGIN YUBISIGNER ED25519 SIGNATURE----- 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef ... -----END YUBISIGNER ED25519 SIGNATURE----- ``` ## Integration with NeoMutt See [neomutt-config](https://git.virebent.art/virebent/neomutt-config) for mail2news integration with automatic YubiKey signing via the `vim-yubisigner` wrapper. ## License MIT (same as original yubisigner) ## Credits - **Stefan Claas** ([@Ch1ffr3punk](https://github.com/Ch1ffr3punk)): Original yubisigner GUI application - **Gab Virebent**: CLI extraction for automation workflows All cryptographic logic is Stefan's work. This is purely a CLI wrapper around his signing implementation.