Start · Sprachen · PHP · Referenz · rnp_op_verify_detached

rnp_op_verify_detached

Funktion

Erstellt und initialisiert eine Verifizierungsoperation für abgetrennte (detached) OpenPGP-Signaturen über die RNP-Bibliothek.

Kategorie: crypto

Signatur

rnp_op_verify_detached(RnpFFI $ffi, RnpInput $input, RnpInput $signature): RnpOpVerify

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

Typ
RnpOpVerify
Beschreibung
Gibt ein 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);
?>
Anzahl Signaturen: 1 Signatur 0 Status: 0

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);
?>
Signatur ist gültig.

// 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_execute immer den Rückgabestatus jeder einzelnen Signatur über rnp_op_sign_signature_get_status — der Status 0 bedeutet 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.