Signatur
Beschreibung
rnp_op_verify_detached gehört zur PHP-Erweiterung der RNP-Bibliothek (eine moderne OpenPGP-Implementierung) und wird verwendet, um eine abgetrennte Signatur zu prüfen. Bei einer abgetrennten Signatur liegen die Nutzdaten (die signierten Daten) und die Signatur in separaten Dateien bzw. Eingabe-Streams vor – im Gegensatz zu eingebetteten Signaturen, bei denen die Signatur direkt in das signierte Dokument eingebettet ist.
Die Funktion erzeugt ein RnpOpVerify-Objekt, über das anschließend mit rnp_op_verify_execute die eigentliche Prüfung durchgeführt und mit rnp_op_verify_get_signature_count sowie rnp_op_verify_get_signature_at das Ergebnis ausgewertet werden kann. Dieser zweistufige Ansatz (Initialisierung + Ausführung) ermöglicht es, vor der Verifikation optional weitere Einstellungen vorzunehmen.
Typische Anwendungsfälle sind die Prüfung von Software-Releases (z. B. GNU-Pakete mit separaten .sig-Dateien), signierte E-Mail-Anhänge oder beliebige Dokumente, bei denen die Integrität und Authentizität getrennt vom Inhalt belegt wird.
- Der
$input-Parameter repräsentiert die Originaldaten (die signierten Nutzdaten). - Der
$signature-Parameter repräsentiert den separaten Signatur-Stream.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ffi Pflicht | RnpFFI | Ein gültiges RnpFFI-Kontext-Objekt, das zuvor mit rnp_ffi_create erstellt und mit einem Schlüsselbund befüllt wurde (z. B. über rnp_load_keys). Ohne geladene öffentliche Schlüssel kann keine Signatur verifiziert werden. |
|
| $input Pflicht | RnpInput | Ein RnpInput-Objekt, das die Originaldaten (Nutzdaten) enthält, deren Signatur geprüft werden soll. Kann aus einer Datei (rnp_input_from_path) oder aus einem Speicherpuffer (rnp_input_from_memory) erzeugt werden. |
|
| $signature Pflicht | RnpInput | Ein RnpInput-Objekt, das die abgetrennte Signatur enthält (z. B. eine .sig- oder .asc-Datei). Muss eine gültige OpenPGP-Signatur enthalten, die zu den Originaldaten gehört. |
Rückgabewert
RnpOpVerify-Objekt zurück, das die initialisierte Verifizierungsoperation repräsentiert. Über dieses Objekt werden anschließend rnp_op_verify_execute (Ausführung der Prüfung) und Methoden zur Ergebnis-Auswertung aufgerufen. Im Fehlerfall wird eine Ausnahme ausgelöst oder false zurückgegeben.Beispiele
Abgetrennte Signatur einer Datei prüfen
<?php
// FFI-Kontext erstellen (z. B. für OpenPGP-Schlüssel im GnuPG-Format)
$ffi = rnp_ffi_create('GPG', 'GPG');
// Öffentlichen Schlüsselbund laden (enthält den Schlüssel des Unterzeichners)
rnp_load_keys($ffi, 'GPG', rnp_input_from_path('/home/user/.gnupg/pubring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);
// Originaldaten und abgetrennte Signatur als Eingabe öffnen
$inputData = rnp_input_from_path('/pfad/zur/datei.tar.gz');
$inputSignature = rnp_input_from_path('/pfad/zur/datei.tar.gz.sig');
// Verifikationsoperation für abgetrennte Signatur initialisieren
$verifyOp = rnp_op_verify_detached($ffi, $inputData, $inputSignature);
// Verifikation ausführen
rnp_op_verify_execute($verifyOp);
// Anzahl der enthaltenen Signaturen ermitteln
$count = rnp_op_verify_get_signature_count($verifyOp);
echo "Anzahl Signaturen: $count\n";
for ($i = 0; $i < $count; $i++) {
$sig = rnp_op_verify_get_signature_at($verifyOp, $i);
$status = rnp_op_sign_signature_get_status($sig);
echo "Signatur $i Status: $status\n";
}
// Ressourcen freigeben
rnp_input_destroy($inputData);
rnp_input_destroy($inputSignature);
rnp_ffi_destroy($ffi);
?>
Signatur aus Speicherpuffer verifizieren
<?php
// Daten und Signatur aus Variablen (z. B. nach HTTP-Upload) prüfen
$dataBytes = file_get_contents('/tmp/upload/dokument.pdf');
$signatureBytes = file_get_contents('/tmp/upload/dokument.pdf.asc');
$ffi = rnp_ffi_create('GPG', 'GPG');
// Vertrauenswürdige öffentliche Schlüssel laden
$keyringInput = rnp_input_from_path('/var/app/trusted_keys.gpg');
rnp_load_keys($ffi, 'GPG', $keyringInput, RNP_LOAD_SAVE_PUBLIC_KEYS);
rnp_input_destroy($keyringInput);
// Eingaben aus Speicher erstellen
$inputData = rnp_input_from_memory($dataBytes);
$inputSignature = rnp_input_from_memory($signatureBytes);
// Abgetrennte Signatur prüfen
$verifyOp = rnp_op_verify_detached($ffi, $inputData, $inputSignature);
rnp_op_verify_execute($verifyOp);
$count = rnp_op_verify_get_signature_count($verifyOp);
if ($count > 0) {
$sig = rnp_op_verify_get_signature_at($verifyOp, 0);
$status = rnp_op_sign_signature_get_status($sig);
if ($status === 0) {
echo "Signatur ist gültig.\n";
} else {
echo "Signatur ist UNGÜLTIG (Status: $status).\n";
}
} else {
echo "Keine Signaturen gefunden.\n";
}
rnp_input_destroy($inputData);
rnp_input_destroy($inputSignature);
rnp_ffi_destroy($ffi);
?>
// Wichtig · Fallstricke
Sicherheitshinweise:
- Eine erfolgreiche Verifikation bestätigt nur die kryptografische Integrität und die Herkunft der Daten. Stellen Sie sicher, dass der verwendete öffentliche Schlüssel tatsächlich vertrauenswürdig ist (Schlüsselverifizierung, Web of Trust).
- Prüfen Sie nach
rnp_op_verify_executeimmer den Rückgabestatus jeder einzelnen Signatur überrnp_op_sign_signature_get_status— der Status0bedeutet Erfolg; andere Werte deuten auf ungültige, abgelaufene oder unbekannte Signaturen hin. - Laden Sie ausschließlich öffentliche Schlüssel aus vertrauenswürdigen Quellen. Ein mit einem unbekannten Schlüssel signiertes Dokument kann nicht als authentisch gelten, selbst wenn die Signatur technisch korrekt ist.
- Diese Funktion ist Teil der PHP-RNP-Erweiterung (
ext-rnp), die separat installiert werden muss. Sie steht nicht im PHP-Standard-Funktionsumfang zur Verfügung.