ошибка безопасного кода Apple

У меня есть следующий код инициализации Apple Security API:

    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");
}

На этой линии:

status = SSLHandshake(sslContext);

Мой обратный вызов SSLWriteFunc называется. Он пытается отправить 174 байта (я не хотел его отправлять) через SSLWrite, но все равно не получается. Но в документации по SSLHandshake написано «При успешном возврате сеанс готов к нормальной защищенной связи с использованием функций SSLRead (:::🙂 и SSLWrite (::::). «. Так что в моем случае не было возврата от этого метода, а затем мой SSLWriteFunc внезапно попытался отправить данные через SSLWrite. Я просто не понимаю, что я делаю неправильно. Пожалуйста, ребята, помогите мне.

0

Решение

SSLRead() а также SSLWrite() должен вызываться из кода вашего приложения, а не изнутри SSLReadFunc а также SSLWriteFunc Обратные вызовы.

в SSLReadFunc а также SSLWriteFunc обратные вызовы, SecureTransport просит вас получать / отправлять данные из вашего сокета (который вы устанавливаете с помощью SSLSetConnection). Так в SSLWriteFuncвам дают зашифрованные данные для отправки через сокет. Ваша реализация SSLWriteFunc должен выглядеть примерно так:

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;
}

Вы захотите добавить к этому дополнительную обработку ошибок (в случае закрытия сокета и т. Д.), Но это должна быть базовая структура.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]