nc_program_manager/.paul/PROJECT.md
dtrentin 39a9566858 feat(07-license-core): RSA offline license core
Phase 07 complete:
- IMachineFingerprint + ILicenseValidator interfaces
- MachineFingerprint: WMI CPU ProcessorID + BaseBoard SerialNumber
- LicenseValidator: RSACryptoServiceProvider + SHA256, injectable public key
- LicenseFile.TryRead: out-param bool, no exceptions from file I/O
- 6 NUnit tests (valid/wrong-machine/tampered/empty/not-base64/missing-file)
- 118 tests total, 116 pass, 2 Fanuc FOCAS ignored (Windows DLL)
- Fix: missing 'using System' in CncMachineFactoryTests.cs
- Fix: Dockerfile.test updated for NcProgramManager rename

PublicKeyXml = PLACEHOLDER until Phase 09 generates real key pair.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:58:14 +02:00

107 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# NcProgramManager
## What This Is
Console EXE (C# .NET 4.7.2) for upload/download of CNC programs to/from machine controllers. Supports Fanuc FOCAS, Heidenhain LSV2, Siemens Sinumerik FTP, and Mitsubishi FTP. Runs on Windows, distributed to licensed machine operators and integrators.
## Core Value
Machinists and operators transfer CNC programs to/from any controller without manual intervention or internet access.
## Current State
| Attribute | Value |
|-----------|-------|
| Type | Application |
| Version | 0.2.0-dev |
| Status | v0.2 in progress — Phase 07 complete |
| Last Updated | 2026-05-17 |
## Requirements
### Core Features
- Upload programs to CNC controller
- Download programs from CNC controller
- Local file management (organize/store programs on disk)
- Multi-CN brand support (Fanuc + others)
### Validated (Shipped)
- [x] Fanuc FOCAS upload/download — initial
- [x] AES encryption for program files
- [x] CLI argument parsing
- [x] Machine-bound license check (hardcoded)
- [x] Multi-CN support — Fanuc, Heidenhain, Siemens, Mitsubishi — Phase 14
- [x] 3-file management mode (Fanuc) via IFanucMachine — Phase 4
- [x] NC program validation before upload (all 4 manufacturers) — Phase 5
- [x] Project renamed FanucProgramManager → NcProgramManager — Phase 6
### Validated (Shipped) — continued
- [x] RSA offline license core: IMachineFingerprint, ILicenseValidator, LicenseValidator, LicenseFile — Phase 7
### Planned (Next)
- [ ] Wire license into Program.cs — replace checkLicense, replace -chiave= with -licfile= (Phase 08)
- [ ] License generator tool — sign fingerprint with RSA private key, write .lic file (Phase 09)
- [ ] Replace PublicKeyXml PLACEHOLDER with real vendor key pair (Phase 09 output)
- [ ] ReadActiveProgramAsync / SelectMainProgram for Heidenhain and Siemens
- [ ] Integration test against real hardware (Heidenhain, Siemens, Mitsubishi)
### Out of Scope
- Cloud sync
- Web UI
- Internet-dependent license validation
## Constraints
### Technical Constraints
- .NET Framework 4.7.2 — max compatibility, no upgrade
- Fanuc FOCAS via `fwlib32` (32-bit DLL, Windows-only)
- Must run offline — no internet dependency at runtime
- License validation must work without network
### Business Constraints
- Software must be license-protected (offline, machine-bound)
- Current approach: hardcoded machine check — needs improvement
- Target: hardware fingerprint + encrypted license file
## Key Decisions
| Decision | Rationale | Date | Status |
|----------|-----------|------|--------|
| .NET 4.7.2 | Max compatibility with operator machines | 2026-05-13 | Active |
| Console EXE output | Simple deployment, scriptable | 2026-05-13 | Active |
| Offline license only | Operators may have no internet on shop floor | 2026-05-13 | Active |
| `#` = Warning in Fanuc/Mitsubishi | Macro variable indicator — valid in context | 2026-05-13 | Active |
| Constructor injection for validator | Internal ctor accepts mock — enables unit testing without Windows DLL | 2026-05-13 | Active |
| RSA asymmetric licensing | Private key vendor-only; public key embedded in binary — decompiler can't forge licenses | 2026-05-17 | Active |
| PublicKeyXml PLACEHOLDER until Phase 09 | Real key pair not yet generated; prevents blocking Phase 07 on Phase 09 | 2026-05-17 | Active |
| Heidenhain LSV2 port 19000 | Standard LSV2 port; needs real hardware verification | 2026-05-13 | Active |
| Siemens FTP dir `/_N_MPF_DIR/` | Sinumerik standard MPF directory; FTP option must be enabled | 2026-05-13 | Active |
## Success Metrics
| Metric | Target | Current | Status |
|--------|--------|---------|--------|
| Program transfer correctness | 100% (byte-verified) | Unknown | Pending hardware test |
| License validation (offline) | Works without network | RSA core built, wiring Phase 08 | In progress |
| Multi-CN support | ≥2 manufacturers | 4 (Fanuc/Heidenhain/Siemens/Mitsubishi) | Done |
| NC validation coverage | All manufacturers | 4 manufacturers, 30+ tests | Done |
## Tech Stack / Tools
| Layer | Technology | Notes |
|-------|------------|-------|
| Language | C# | .NET Framework 4.7.2 |
| UI | Console EXE | CLI args via InputArgs.cs |
| CN Protocol (Fanuc) | FOCAS fwlib32 | 32-bit DLL, Windows-only |
| CN Protocol (Heidenhain) | LSV2 over TCP | Port 19000, CRC-16/CCITT |
| CN Protocol (Siemens) | FTP (FtpWebRequest) | ASCII mode, passive, `/_N_MPF_DIR/` |
| CN Protocol (Mitsubishi) | FTP (FtpWebRequest) | Port 21, `/PRG/`, no extensions |
| Validation | NcProgramValidator | Universal + per-manufacturer rules |
| Encryption | AES (AesCrypt.cs) | Program file protection |
| Licensing | RSA-SHA256 asymmetric | IMachineFingerprint + ILicenseValidator; wiring in Phase 08 |
| Testing | NUnit 3.13.3 + Moq 4.18.4 | .NET 4.7.2 test project |
---
*PROJECT.md — Updated when requirements or context change*
*Last updated: 2026-05-17 after Phase 7 (License Core)*