Я написал базовый клиент winsock и пытаюсь реализовать tls для https позже. Я написал функцию, которая собирает открытый текст для отправки Winsock’s
int send( SOCKET s,const char *buf,int len, int flags)
как const char*
или же BYTE*
массив.
BYTE * ComputeTLSRecordPlainText(BYTE * phandshakerequest, _in_ const int handshakesize, _out_ int * pTLSrecordsize, _in_ BYTE controltype, _in_ BYTE * protocolversion)
{
*pTLSrecordsize = handshakesize + 5;
BYTE * TLSPlainText = new BYTE[*pTLSrecordsize];
TLSPlainText[0] = controltype;
TLSPlainText[1] = protocolversion[1]; //Major.
TLSPlainText[2] = protocolversion[0]; //Minor.
TLSPlainText[3] = handshakesize;
TLSPlainText[4] = 0x0; // Refactor for messages greater than 255 bytes.
for (int j = 5; j < *pTLSrecordsize; j++)
{
TLSPlainText[j] = phandshakerequest[j - 5];
}
return TLSPlainText;
}
Цикл for добавляет сообщение рукопожатия, к которому добавлен hellomessage. Для краткости я не включил их здесь.
Единственный действительный ответ TLS, который я получил, был от сервера google.com, который отвечает правильным фатальным предупреждением с десятичным кодом 70: protocol_version.
Другие сайты либо recv()
не возвращается, или это происходит с ошибкой 10054. Или с заголовками http и неправильным запросом. Я инициализировал соединение с портом 443?
Итак, мой вопрос заключается в следующем
1) Правильно ли я форматирую запись по порядку байтов в сети и по порядку байтов?
2) Что происходит с разницей в ответах сервера? Может ли это быть что-то со слоем TCP? Нормальный каждый день HTTPS HTTP по TLS через TCP правильно?
Задача ещё не решена.
Других решений пока нет …