TLS 1.0 프로토콜에서 메시지 완료
키 교환 및 인증 프로세스의 성공을 확인하기 위해 변경 암호 사양 메시지 직후에 완료 메시지가 전송됩니다. TLS 1.0 프로토콜의 완료 메시지는 master 키, 레이블 및 시드를 입력으로 사용하여 PRF(의사 임의 함수)를 사용하여 계산됩니다. PRF는 임의 길이의 출력을 생성합니다. 다음 메서드는 TLS 1.0 완료 메시지에 사용되는 PRF 출력을 생성하는 데 사용됩니다.
PRF 해시 핸들은 ALG_ID 값이 CALG_TLS1PRF 설정된 CryptCreateHash와 hKey 매개 변수에 전달된 master 키에 대한 핸들을 사용하여 생성됩니다. 레이블 및 시드 값은 cryptSetHashParam 함수가 있는 dwParam 매개 변수에서 각각 HP_TLS1PRF_LABEL 및 HP_TLS1PRF_SEED 값을 사용하여 해시 핸들에 설정됩니다. 마지막으로 프로토콜 엔진은 dwParam 매개 변수에 HP_HASHVAL 값으로 CryptGetHashParam 함수를 호출하여 완료 메시지에 포함될 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);