Поделиться через


Завершение сообщений в протоколе 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);