2017-02-08 3 views
0

Ich habe den folgenden Code von Apple Security API Initialisierung:Apfel sicheren Transport Codefehler

OSStatus status = noErr; 
    sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType); 
    if (sslContext == nullptr) 
    { 
     throw std::runtime_error("cannot create ssl context"); 
    } 

    status = SSLSetIOFuncs(sslContext, socketRead, socketWrite); 
    if (status != noErr) 
    { 
     throw std::runtime_error("cannot set ssl io functions"); 
    } 

    status = SSLSetConnection(sslContext, reinterpret_cast<void*>(&handle)); 
    if (status != noErr) 
    { 
     throw std::runtime_error("cannot set ssl connections"); 
    } 

    status = SSLSetPeerDomainName(sslContext, address.c_str(), address.length()); 
    if (status != noErr) 
    { 
     throw std::runtime_error("cannot set ssl peer domain name"); 
    } 

    status = SSLSetSessionOption(sslContext, kSSLSessionOptionBreakOnServerAuth, true); 
    if (status != noErr) 
    { 
     throw std::runtime_error("cannot set ssl options"); 
    } 

    status = SSLHandshake(sslContext); 
    if (status != noErr) 
    { 
     throw std::runtime_error("cannot perform ssl handshake"); 
    } 

Auf dieser Linie:

status = SSLHandshake(sslContext); 

mein SSLWriteFunc Rückruf aufgerufen wird. Es versucht, 174 Bytes zu senden (ich wollte es nicht senden) über SSLWrite, aber es schlägt trotzdem fehl. Aber in der Dokumentation über SSLHandshake geschrieben steht: "Bei erfolgreicher Rückgabe ist die Sitzung bereit für normale sichere Kommunikation mit der Funktionen SSLRead (:: : :) und SSLWrite (:: . :)". Also in meinem Fall gab es keine Rückkehr von dieser Methode und dann versuchte mein SSLWriteFunc plötzlich, Daten über SSLWrite zu senden. Ich verstehe einfach nicht, was ich falsch mache. Bitte Leute helfen mir.

Antwort

0

SSLRead() und SSLWrite() sollte von Ihrem Anwendungscode aufgerufen werden, nicht von innerhalb der SSLReadFunc und SSLWriteFunc Rückrufe.

In den SSLReadFunc und SSLWriteFunc Rückrufe ist Securetransport fragen Sie Daten aus Ihrer Steckdose zu empfangen/senden (die Sie mit SSLSetConnection gesetzt). In SSLWriteFunc erhalten Sie also verschlüsselte Daten, die Sie über Ihren Socket senden können. Ihre Implementierung von SSLWriteFunc sollte ungefähr so ​​aussehen:

OSStatus mySSLWriteFunc(SSLConnectionRef connection, const void *data, size_t *dataLength) 
{ 
    int *handle; 
    SSLGetConnection(connection, &handle); 
    size_t result = write(*handle, data, *dataLength); 
    if (result == -1) 
    { 
     if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) 
      return errSSLWouldBlock; 
     else 
      // fill this in 
    } 
    else 
    { 
     *dataLength = result; 
    } 
    return noErr; 
} 

Sie wollen werden zusätzliche Fehler hinzufügen, um die Handhabung (falls der Socket geschlossen, etc.), aber das sollte die Grundstruktur sein.

+0

Vielen Dank! – slowcheetah