feat: PemKeyLoader — Laden und Validieren von PEM-Schlüsseln #7

Open
opened 2026-07-26 19:20:49 +02:00 by claudeCode · 0 comments
Member

Motivation

RSA- und ECDSA-Services benötigen PEM-Schlüssel aus verschiedenen Quellen (Dateisystem, Umgebungsvariablen, Datenbank). Ein zentraler PemKeyLoader kapselt das Laden, validiert das Format frühzeitig und gibt klare Fehlermeldungen — anstatt kryptische OpenSSL-Fehler durchzureichen.

API

// Aus String (z.B. Umgebungsvariable):
$key = PemKeyLoader::fromString($pemString);

// Aus Datei:
$key = PemKeyLoader::fromFile('/path/to/private.pem');

// Typ-Abfrage:
$key->isPrivateKey(): bool
$key->isPublicKey(): bool
$key->getType(): PemKeyType   // Enum: PrivateKey | PublicKey
$key->toPem(): string
$key->toOpenSslKey(): \OpenSSLAsymmetricKey

PemKeyType Enum

enum PemKeyType {
    case PrivateKey;
    case PublicKey;
}

Implementierungsdetails

  • fromString() nutzt openssl_pkey_get_private() / openssl_pkey_get_public() zur Validierung
  • Wirft \InvalidArgumentException bei ungültigem PEM-Format
  • Wirft \RuntimeException bei Lesefehler (Datei nicht vorhanden, keine Berechtigung)
  • toOpenSslKey() gibt das interne \OpenSSLAsymmetricKey-Handle zurück — für direkte Nutzung in RSA/ECDSA-Services
  • Namespace: Tez\Utils\Crypto\Asymmetric

Aufgaben

  • src/Asymmetric/PemKeyType.php (Enum) implementieren
  • src/Asymmetric/PemKeyLoader.php implementieren
  • Unit-Tests in tests/Asymmetric/PemKeyLoaderTest.php
    • Laden eines validen Private Key PEM
    • Laden eines validen Public Key PEM
    • fromFile() mit existierender Datei
    • Fehlerfall: ungültiger PEM-String
    • Fehlerfall: nicht existierende Datei
    • Typ-Erkennung (isPrivateKey / isPublicKey)
  • README-Abschnitt

Abhängigkeiten

  • Blockiert von #1 (Namespace-Reorganisation)
  • Wird von #5 (RSA) und #6 (ECDSA) genutzt
## Motivation RSA- und ECDSA-Services benötigen PEM-Schlüssel aus verschiedenen Quellen (Dateisystem, Umgebungsvariablen, Datenbank). Ein zentraler `PemKeyLoader` kapselt das Laden, validiert das Format frühzeitig und gibt klare Fehlermeldungen — anstatt kryptische OpenSSL-Fehler durchzureichen. ## API ```php // Aus String (z.B. Umgebungsvariable): $key = PemKeyLoader::fromString($pemString); // Aus Datei: $key = PemKeyLoader::fromFile('/path/to/private.pem'); // Typ-Abfrage: $key->isPrivateKey(): bool $key->isPublicKey(): bool $key->getType(): PemKeyType // Enum: PrivateKey | PublicKey $key->toPem(): string $key->toOpenSslKey(): \OpenSSLAsymmetricKey ``` ## PemKeyType Enum ```php enum PemKeyType { case PrivateKey; case PublicKey; } ``` ## Implementierungsdetails - `fromString()` nutzt `openssl_pkey_get_private()` / `openssl_pkey_get_public()` zur Validierung - Wirft `\InvalidArgumentException` bei ungültigem PEM-Format - Wirft `\RuntimeException` bei Lesefehler (Datei nicht vorhanden, keine Berechtigung) - `toOpenSslKey()` gibt das interne `\OpenSSLAsymmetricKey`-Handle zurück — für direkte Nutzung in RSA/ECDSA-Services - Namespace: `Tez\Utils\Crypto\Asymmetric` ## Aufgaben - [ ] `src/Asymmetric/PemKeyType.php` (Enum) implementieren - [ ] `src/Asymmetric/PemKeyLoader.php` implementieren - [ ] Unit-Tests in `tests/Asymmetric/PemKeyLoaderTest.php` - Laden eines validen Private Key PEM - Laden eines validen Public Key PEM - `fromFile()` mit existierender Datei - Fehlerfall: ungültiger PEM-String - Fehlerfall: nicht existierende Datei - Typ-Erkennung (isPrivateKey / isPublicKey) - [ ] README-Abschnitt ## Abhängigkeiten - Blockiert von #1 (Namespace-Reorganisation) - Wird von #5 (RSA) und #6 (ECDSA) genutzt
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tez/tez-utils-crypto#7