Fungsi CryptSignHashA (wincrypt.h)
Sintaksis
BOOL CryptSignHashA(
[in] HCRYPTHASH hHash,
[in] DWORD dwKeySpec,
[in] LPCSTR szDescription,
[in] DWORD dwFlags,
[out] BYTE *pbSignature,
[in, out] DWORD *pdwSigLen
);
Parameter
[in] hHash
Menangani objek hash yang akan ditandatangani.
[in] dwKeySpec
Mengidentifikasi kunci privat yang akan digunakan dari kontainer penyedia. Ini bisa AT_KEYEXCHANGE atau AT_SIGNATURE.
Algoritma tanda tangan yang digunakan ditentukan ketika pasangan kunci awalnya dibuat.
Satu-satunya algoritma tanda tangan yang didukung Penyedia Kriptografi Dasar Microsoft adalah algoritma Kunci Umum RSA.
[in] szDescription
Parameter ini tidak lagi digunakan dan harus diatur ke NULL untuk mencegah kerentanan keamanan. Namun, ini masih didukung untuk kompatibilitas mundur di Penyedia Kriptografi Microsoft Base.
[in] dwFlags
Nilai bendera berikut ditentukan.
Nilai | Arti |
---|---|
|
Digunakan dengan penyedia RSA. Hash pengidentifikasi objek (OID) tidak ditempatkan dalam enkripsi kunci publik RSA. Jika bendera ini tidak diatur, hash OID dalam tanda tangan default adalah seperti yang ditentukan dalam definisi DigestInfo di PKCS #1. |
|
Bendera ini tidak digunakan. |
|
Gunakan metode padding tanda tangan RSA yang ditentukan dalam standar ANSI X9.31. |
[out] pbSignature
Penunjuk ke buffer yang menerima data tanda tangan.
Parameter ini dapat NULL untuk mengatur ukuran buffer untuk tujuan alokasi memori. Untuk informasi selengkapnya, lihat Mengambil DataPanjang Tidak Diketahui .
[in, out] pdwSigLen
Penunjuk ke nilai DWORD
Mengembalikan nilai
Jika fungsi berhasil, fungsi mengembalikan TRUE.
Jika fungsi gagal, fungsi mengembalikan FALSE. Untuk informasi kesalahan yang diperluas, panggil GetLastError.
Kode kesalahan yang diawali oleh "NTE" dihasilkan oleh CSP tertentu yang Anda gunakan. Beberapa kemungkinan kode kesalahan mengikuti.
Mengembalikan kode | Deskripsi |
---|---|
|
Salah satu parameter menentukan handel yang tidak valid. |
|
Salah satu parameter berisi nilai yang tidak valid. Ini paling sering merupakan pointer yang tidak valid. |
|
Buffer yang ditentukan oleh parameter pbSignature |
|
Handel |
|
Parameter dwFlags nonzero. |
|
Objek hash yang ditentukan oleh parameter hHash tidak valid. |
|
Konteks CSP yang ditentukan ketika objek hash dibuat tidak dapat ditemukan. |
|
Kunci privat yang ditentukan oleh dwKeySpec tidak ada. |
|
CSP kehabisan memori selama operasi. |
Komentar
Sebelum memanggil fungsi ini, fungsi
Sementara DSS CSP mendukung hashing dengan algoritma hash MD5 dan SHA, DSS CSP hanya mendukung penandatanganan hash SHA.
Setelah fungsi ini dipanggil, tidak ada lagi data yang dapat ditambahkan ke hash. Panggilan tambahan ke CryptHashData atau CryptHashSessionKey gagal.
Setelah aplikasi selesai menggunakan hash, hancurkan objek hash dengan memanggil fungsi CryptDestroyHash.
Secara default, penyedia Microsoft RSA menggunakan metode padding PKCS #1 untuk tanda tangan. OID hash di elemen DigestInfo
Terkadang, nilai hash yang telah dihasilkan di tempat lain harus ditandatangani. Ini dapat dilakukan dengan menggunakan urutan operasi berikut:
- Buat objek hash dengan menggunakan CryptCreateHash.
- Atur nilai hash dalam objek hash dengan menggunakan nilai
HP_HASHVAL parameterdwParam di CryptSetHashParam . - Tanda tangani nilai hash dengan menggunakan
CryptSignHash dan dapatkan blok tanda tangan digital. - Hancurkan objek hash dengan menggunakan CryptDestroyHash.
Contoh
Contoh berikut menunjukkan data penandatanganan dengan terlebih dahulu hash data yang akan ditandatangani lalu menandatangani hash dengan menggunakan fungsi
//-------------------------------------------------------------
// 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);
Untuk contoh lengkap termasuk konteks untuk kode ini, lihat Contoh Program C: Menandatangani Hash dan Memverifikasi Tanda Tangan Hash.
Nota
Header wincrypt.h mendefinisikan CryptSignHash sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta preprosedur UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.
Persyaratan
Syarat | Nilai |
---|---|
klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
server minimum yang didukung |
Windows Server 2003 [hanya aplikasi desktop] |
Platform Target |
Windows |
Header |
wincrypt.h |
Pustaka |
Advapi32.lib |
DLL |
Advapi32.dll |
Lihat juga
Fungsi Hash dan Tanda Tangan Digital