CryptSignHashA 함수(wincrypt.h)
통사론
BOOL CryptSignHashA(
[in] HCRYPTHASH hHash,
[in] DWORD dwKeySpec,
[in] LPCSTR szDescription,
[in] DWORD dwFlags,
[out] BYTE *pbSignature,
[in, out] DWORD *pdwSigLen
);
매개 변수
[in] hHash
서명할 해시 개체 핸들입니다.
[in] dwKeySpec
공급자의 컨테이너에서 사용할 프라이빗 키를 식별합니다. AT_KEYEXCHANGE 또는 AT_SIGNATURE 수 있습니다.
키 쌍을 처음 만들 때 사용되는 서명 알고리즘이 지정됩니다.
Microsoft 기본 암호화 공급자가 지원하는 유일한 서명 알고리즘은 RSA 공개 키 알고리즘입니다.
[in] szDescription
이 매개 변수는 더 이상 사용되지 않으며 보안 취약성을 방지하기 위해 NULL
[in] dwFlags
다음 플래그 값이 정의됩니다.
값 | 의미 |
---|---|
|
RSA 공급자와 함께 사용됩니다. 해시 개체 식별자(OID)는 RSA 공개 키 암호화에 배치되지 않습니다. 이 플래그가 설정되지 않은 경우 기본 서명의 해시 OID는 PKCS #1의 DigestInfo 정의에 지정된 대로 지정됩니다. |
|
이 플래그는 사용되지 않습니다. |
|
ANSI X9.31 표준에 지정된 RSA 서명 패딩 메서드를 사용합니다. |
[out] pbSignature
서명 데이터를 수신하는 버퍼에 대한 포인터입니다.
이 매개 변수는 NULL
[in, out] pdwSigLen
pbSignature 버퍼의 크기(바이트)를 지정하는 DWORD 값에 대한 포인터입니다. 함수가 반환될 때 DWORD 값에는 버퍼에 저장된 바이트 수가 포함됩니다.
반환 값
함수가 성공하면 함수는 true
함수가 실패하면 false
"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 몇 가지 가능한 오류 코드는 다음과 같습니다.
반환 코드 | 묘사 |
---|---|
|
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다. |
|
매개 변수 중 하나에 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다. |
|
pbSignature 매개 변수로 지정된 버퍼가 반환된 데이터를 저장할 만큼 크지 않습니다. 필요한 버퍼 크기(바이트)는 pdwSigLenDWORD 값에 있습니다. |
|
hHash 핸들은 이 CSP가 지원하지 않는 알고리즘을 지정하거나 dwKeySpec 매개 변수에 잘못된 값이 있습니다. |
|
dwFlags 매개 변수가 0이 아닌 경우 |
|
hHash 매개 변수로 지정된 해시 개체가 잘못되었습니다. |
|
해시 개체를 만들 때 지정한 CSP 컨텍스트를 찾을 수 없습니다. |
|
dwKeySpec 지정된 프라이빗 키가 없습니다. |
|
작업 중에 CSP 메모리가 부족합니다. |
발언
이 함수를 호출하기 전에 CryptCreateHash 함수를 호출하여 해시 개체에 대한 핸들을 가져와야 합니다. 그런 다음 CryptHashData 또는 CryptHashSessionKey 함수를 사용하여 해시 개체에 데이터 또는 세션 키를 추가합니다. CryptSignHash 함수는 해시를 완료합니다.
DSS CSP는 MD5 및 SHA 해시 알고리즘을 모두 사용하여 해시를 지원하지만 DSS CSP는 SHA 해시 서명만 지원합니다.
이 함수가 호출되면 해시에 더 이상 데이터를 추가할 수 없습니다. CryptHashData 또는 CryptHashSessionKey 대한 추가 호출이 실패합니다.
애플리케이션이 해시 사용을 완료한 후 CryptDestroyHash 함수를 호출하여 해시 개체를 삭제합니다.
기본적으로 Microsoft RSA 공급자는 서명에 PKCS #1 패딩 메서드를 사용합니다. 서명의 DigestInfo 요소에 있는 해시 OID는 해시 개체와 연결된 알고리즘 OID로 자동으로 설정됩니다. CRYPT_NOHASHOID 플래그를 사용하면 이 OID가 서명에서 생략됩니다.
경우에 따라 다른 곳에서 생성된 해시 값에 서명해야 합니다. 이 작업은 다음 작업 시퀀스를 사용하여 수행할 수 있습니다.
- CryptCreateHash사용하여 해시 개체를 만듭니다.
- CryptSetHashParamdwParam 매개 변수의 HP_HASHVAL 값을 사용하여 해시 개체의 해시 값을 설정합니다.
- CryptSignHash 사용하여 해시 값에 서명하고 디지털 서명 블록을 가져옵니다.
- CryptDestroyHash사용하여 해시 개체를 삭제합니다.
예제
다음 예제에서는 먼저 서명할 데이터를 해시한 다음 CryptSignHash 함수를 사용하여 해시에 서명하여 데이터에 서명하는 방법을 보여 줍니다.
//-------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hProv;
BYTE *pbBuffer= (BYTE *)"Sample data that is to be signed.";
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
HCRYPTHASH hHash;
//--------------------------------------------------------------------
// This code assumes that a cryptographic context handle, hProv,
// and a hash handle, hHash, are available.
// For code needed to acquire the context, see "Example C Program:
// Signing a Hash and Verifying the Hash Signature."
//--------------------------------------------------------------------
// Compute the cryptographic hash of the buffer.
if(CryptHashData(
hHash,
pbBuffer,
dwBufferLen,
0))
{
printf("The data buffer has been hashed.\n");
}
else
{
printf("Error during CryptHashData.\n");
exit(1);
}
//--------------------------------------------------------------------
// Determine the size of the signature and allocate memory.
dwSigLen= 0;
if(CryptSignHash(
hHash,
AT_SIGNATURE,
szDescription,
0,
NULL,
&dwSigLen))
{
printf("Signature length %d found.\n",dwSigLen);
}
else
{
printf("Error during CryptSignHash\n");
exit(1);
}
//--------------------------------------------------------------------
// Allocate memory for the signature buffer.
if(pbSignature = (BYTE *)malloc(dwSigLen))
{
printf("Memory allocated for the signature.\n");
}
else
{
printf("Out of memory\n");
exit(1);
}
//--------------------------------------------------------------------
// Sign the hash object.
if(CryptSignHash(
hHash,
AT_SIGNATURE,
szDescription,
0,
pbSignature,
&dwSigLen))
{
printf("pbSignature is the hash signature.\n");
}
else
{
printf("Error during CryptSignHash.\n");
exit(1);
}
//--------------------------------------------------------------------
// Destroy the hash object.
if(hHash)
CryptDestroyHash(hHash);
이 코드의 컨텍스트를 비롯한 전체 예제는 예제 C 프로그램: 해시 서명 및 해시 서명확인을 참조하세요.
메모
wincrypt.h 헤더는 CRYptSignHash를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | wincrypt.h |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |