다음을 통해 공유


TLS 1.0 프로토콜에서 메시지 완료

키 교환 및 인증 프로세스의 성공을 확인하기 위해 변경 암호 사양 메시지 직후에 완료 메시지가 전송됩니다. TLS 1.0 프로토콜의 완료 메시지는 master 키, 레이블 및 시드를 입력으로 사용하여 PRF(의사 임의 함수)를 사용하여 계산됩니다. PRF는 임의 길이의 출력을 생성합니다. 다음 메서드는 TLS 1.0 완료 메시지에 사용되는 PRF 출력을 생성하는 데 사용됩니다.

PRF 해시 핸들은 ALG_ID 값이 CALG_TLS1PRF 설정된 CryptCreateHashhKey 매개 변수에 전달된 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);