Die openssl-Dokumentation zu SSL_shutdown besagt Folgendes: Es wird daher empfohlen, den Rückgabewert von SSL_shutdown () zu überprüfen und SSL_shutdown () erneut aufzurufen, wenn das bidirektionale Herunterfahren noch nicht abgeschlossen ist (Rückgabewert des ersten Aufrufs ist 0).
Ich habe unten ein Code-Snippet, wo ich nach dem Rückgabewert 0 von SSL_shutdown suche und es wieder anrufe, was ich benutzt habe. Meine Frage ist, ob es in Ordnung ist, den Rückgabewert von SSL_shutdown beim zweiten Aufruf zu ignorieren oder wir sollten SSL_shutdown wiederholen, bis eine 1 (bidirektionales Herunterfahren abgeschlossen) zurückgegeben wird.
%Vor% openssl
ist ein bisschen wie eine dunkle Kunst.
Erstens hat die Seite, auf die Sie verwiesen haben, die Rückgabewerte schlecht geschrieben. Hier ist, was die Man-Page eigentlich sagt:
%Vor% Wenn Sie blockierende BIOs haben, sind die Dinge relativ einfach. Eine 0 beim ersten Aufruf bedeutet, dass Sie SSL_shutdown
erneut aufrufen müssen, wenn Sie eine bidirektionale Abschaltung wünschen. Eine 1 bedeutet, dass du fertig bist. A -1 bedeutet einen Fehler. Beim zweiten Anruf (den Sie nur machen, wenn Sie eine 0 zurückbekommen haben), wird eine bidirektionale Abschaltung eingeleitet. Logik diktiert, dass Sie keine 0 wieder zurückbekommen können (weil es eine blockierende BIO ist und den ersten Schritt abgeschlossen haben wird). A -1 zeigt einen Fehler an und eine 1 zeigt den Abschluss an.
Wenn Sie nicht blockierende BIOs haben, gilt das Gleiche, abgesehen von der Tatsache, dass Sie die gesamte SSL_ERROR_WANT_READ
und SSL_ERROR_WANT_WRITE
rigmarole durchgehen müssen, d. h .:
Sie haben also zwei Ebenen der Wiederholung. Sie rufen SSL_shutdown
die 'erste' Zeit auf, aber wiederholen Sie, wenn Sie SSL_ERROR_WANT_READ
oder SSL_ERROR_WANT_WRITE
erhalten, nachdem Sie die select()
-Schleife normal durchlaufen haben, und zählen Sie nur die 'erste' SSL_shutdown
als erledigt ein nicht SSL_ERROR_WANT_
Fehlercode (in diesem Fall ist es fehlgeschlagen), oder Sie erhalten eine 0
oder 1
return. Wenn du 1
return bekommst, hast du es geschafft. Wenn Sie 0
return erhalten und ein bidirektionales Herunterfahren möchten, müssen Sie den zweiten Aufruf ausführen, bei dem Sie erneut nach SSL_ERROR_WANT_READ
oder SSL_ERROR_WANT_WRITE
suchen und versuchen müssen, erneut auszuwählen. das sollte 1
nicht zurückgeben, aber 0 oder einen Fehler zurückgeben.
Nicht einfach.