Schannel에서 반환된 추가 버퍼
보안 컨텍스트가 설정되는 동안 및 나중에 보안 메시지가 Schannel에서 제공하는 암호화 및 암호 해독 기능을 사용하여 교환되기 때문에 클라이언트와 서버 간에 정보를 보내야 합니다. 다음 함수는 이러한 작업을 수행하는 데 사용됩니다.
Schannel에는 이러한 함수에 대한 입력 버퍼에 포함된 불완전하거나 과도한 정보에 대해 잘 정의된 동작 집합이 있습니다. 정보는 다음과 같은 방식으로 클라이언트와 서버 간에 교환됩니다.
- 로컬 파티는 SSPI 함수를 호출하고 정보를 전달하여 Schannel과 상호 작용합니다. 일반적으로 원격 당사자로부터 정보를 받았습니다.
- 함수는 정보를 포함하는 상태 코드 및 출력 버퍼를 반환합니다.
- 상태 코드에 따라 출력 버퍼는 일부 통신 메커니즘을 통해 원격 당사자에게 전송됩니다.
- 원격 당사자는 지역 당사자가 보낸 정보를 읽습니다.
- 루프는 로컬 및 원격 당사자가 서로 교환된 상태에서 반복됩니다. (원격 당사자는 SSPI 함수를 호출하고 이전 단계에서 읽은 정보를 전달합니다.)
SSPI 함수에 대한 입력 버퍼에 필요한 정보가 정확히 포함되어 있으면 모든 것이 예상대로 작동합니다. 그러나 일부 통신 프로토콜의 스트림 지향 특성으로 인해 그렇지 않을 수 있습니다. 원격 당사자로부터 받은 정보 블록에는 단일 함수 호출에서 Schannel에서 처리할 수 있는 것보다 더 적은 데이터가 필요하거나 더 많은 데이터가 포함될 수 있습니다.
입력 버퍼에 정보가 너무 적으면 함수는 SEC_E_INCOMPLETE_MESSAGE 반환합니다. 호출자는 원격 당사자로부터 추가 데이터를 가져와서 함수를 다시 호출해야 합니다.
입력 버퍼에 너무 많은 정보가 포함된 경우 Schannel은 이를 오류로 처리하지 않습니다. 함수는 가능한 한 많은 입력을 처리하고 해당 처리 작업에 대한 상태 코드를 반환합니다. 또한 Schannel은 SECBUFFER_EXTRA 형식의 출력 버퍼를 반환하여 입력 버퍼에 처리되지 않은 정보가 있음을 나타냅니다. 이 유형의 버퍼에 대해 출력 버퍼를 테스트하는 것이 이 상황을 감지하는 유일한 방법입니다. 추가 버퍼 구조의 cbBuffer 필드는 처리되지 않은 입력 바이트 수를 나타냅니다.
참고
추가 버 퍼의 pvBuffer 필드에는 초과 데이터의 복사본이 포함되어 있지 않습니다.
SSPI 함수에서 추가 버퍼를 수신하는 경우 입력 버퍼에서 이미 처리된 정보를 제거하고 함수를 다시 호출해야 합니다. Schannel은 추가 버퍼만 반환하고 출력 버퍼에는 아무것도 반환하지 않는 경우가 많습니다.