Завершение сообщений в протоколе TLS 1.0
Сообщение о завершении отправляется сразу после сообщения спецификации измененного шифра для проверки успешности процессов обмена ключами и проверки подлинности. Сообщения о завершении в протоколе TLS 1.0 вычисляются с помощью псевдослучайной функции (PRF) с ключом master, меткой и начальным значением в качестве входных данных. PRF создает выходные данные произвольной длины. Следующий метод используется для создания выходных данных PRF, используемых в сообщениях о завершении TLS 1.0.
Хэш-дескриптор PRF создается с помощью CryptCreateHashс ALG_ID значением CALG_TLS1PRF и дескриптором master ключа, переданного в параметре hKey. Значения метки и начального значения задаются в хэш-дескрипторе с помощью значений HP_TLS1PRF_LABEL и HP_TLS1PRF_SEED соответственно в параметре dwParam с функцией CryptSetHashParam . Наконец, обработчик протоколов вызывает функцию CryptGetHashParam со значением, HP_HASHVAL в параметре dwParam , чтобы получить данные PRF для включения в сообщение о завершении. При вызове CryptGetHashParam обработчик протоколов должен указать, сколько байтов данных будет создавать PRF. Это делается в параметре pdwDataLen , а полученные данные помещаются в буфер, на который указывает параметр pbData .
Ниже приведен типичный исходный код для этого обработчика протоколов.
CRYPT_DATA_BLOB Data;
HCRYPTHASH hFinishHash;
BYTE rgbFinishPRF[12];
BYTE rgbCliHashOfHandshakes[36];
//------------------------------------------------------------
// get client finish message
CryptCreateHash(
hProv,
CALG_TLS1PRF,
hMasterKey,
0,
&hFinishHash);
Data.pbData = (BYTE*)"client finished";
Data.cbData = 15;
CryptSetHashParam(
hFinishHash,
HP_TLS1PRF_LABEL,
(BYTE*)&Data,
0);
Data.pbData = rgbCliHashOfHandshakes;
Data.cbData = sizeof(rgbCliHashOfHandshakes);
CryptSetHashParam(
hFinishHash,
HP_TLS1PRF_SEED,
(BYTE*)&Data,
0);
cbFinishPRF = sizeof(rgbFinishPRF);
CryptGetHashParam(
hFinishHash,
HP_HASHVAL,
rgbFinishPRF,
&cbFinishPRF,
0);
CryptDestroyHash(hFinishHash);