Fungsi CryptEncodeObjectEx (wincrypt.h)

Fungsi CryptEncodeObjectEx mengodekan struktur jenis yang ditunjukkan oleh nilai parameter lpszStructType . Fungsi ini menawarkan peningkatan performa yang signifikan atas CryptEncodeObject dengan mendukung alokasi memori dengan nilai CRYPT_ENCODE_ALLOC_FLAG .

Sintaks

BOOL CryptEncodeObjectEx(
  [in]      DWORD              dwCertEncodingType,
  [in]      LPCSTR             lpszStructType,
  [in]      const void         *pvStructInfo,
  [in]      DWORD              dwFlags,
  [in]      PCRYPT_ENCODE_PARA pEncodePara,
  [out]     void               *pvEncoded,
  [in, out] DWORD              *pcbEncoded
);

Parameter

[in] dwCertEncodingType

Jenis pengodean sertifikat dan jenis pengodean pesan yang digunakan untuk mengodekan objek. Parameter ini bisa menjadi kombinasi dari satu atau beberapa nilai berikut.

Nilai Makna
PKCS_7_ASN_ENCODING
65536 (0x10000)
Menentukan pengodean pesan PKCS 7.
X509_ASN_ENCODING
1 (0x1)
Menentukan pengodean sertifikat X.509.

[in] lpszStructType

Penunjuk ke pengidentifikasi objek (OID) yang menentukan jenis struktur. Jika kata urutan tinggi dari parameter lpszStructType adalah nol, kata berurutan rendah menentukan pengidentifikasi bilangan bulat untuk jenis struktur yang ditentukan. Jika tidak, parameter ini adalah penunjuk ke string yang dihentikan null yang berisi representasi string OID.

Untuk informasi selengkapnya tentang string pengidentifikasi objek, konstanta yang telah ditentukan sebelumnya dan struktur yang sesuai, lihat Konstanta untuk CryptEncodeObject dan CryptDecodeObject.

[in] pvStructInfo

Penunjuk ke struktur yang akan dikodekan. Struktur harus dari jenis yang ditentukan oleh lpszStructType.

[in] dwFlags

Menentukan opsi untuk pengodean. Parameter ini bisa nol atau kombinasi dari satu atau beberapa nilai berikut.

Nilai Makna
CRYPT_ENCODE_ALLOC_FLAG
32768 (0x8000)
Fungsi pengodean yang disebut mengalokasikan memori untuk byte yang dikodekan. Penunjuk ke byte yang dialokasikan dikembalikan dalam pvEncoded.
CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG
131072 (0x20000)
Bendera ini berlaku untuk mengaktifkan pengodean Punycode dari nilai string Unicode. Untuk informasi selengkapnya, lihat Keterangan.

Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: Bendera ini tidak didukung.

CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAG
1073741824 (0x40000000)
Bendera ini berlaku saat pengodean X509_UNICODE_NAME, X509_UNICODE_NAME_VALUE, atau X509_UNICODE_ANY_STRING. Jika bendera ini diatur, karakter tidak diperiksa untuk menentukan apakah mereka valid untuk jenis nilai yang ditentukan.
CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAG
2147483648 (0x80000000)
Bendera ini berlaku saat pengodean X509_UNICODE_NAME. Jika bendera ini diatur dan semua karakter Unicode adalah <= 0xFF, CERT_RDN_T61_STRING dipilih alih-alih CERT_RDN_UNICODE_STRING.
CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG
536870912 (0x20000000)
Bendera ini berlaku saat mengodekan X509_UNICODE_NAME. Saat diatur, CERT_RDN_UTF8_STRING dipilih alih-alih CERT_RDN_UNICODE_STRING.
CRYPT_UNICODE_NAME_ENCODE_FORCE_UTF8_UNICODE_FLAG
268435456 (0x10000000)
Bendera ini berlaku saat mengodekan X509_UNICODE_NAME. Saat diatur, CERT_RDN_UTF8_STRING dipilih alih-alih CERT_RDN_PRINTABLE_STRING untuk jenis string direktori. Selain itu, bendera ini memungkinkan CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG.

[in] pEncodePara

Penunjuk ke struktur CRYPT_ENCODE_PARA yang berisi informasi pengodean. Parameter ini bisa NULL.

Jika pEncodePara atau anggota pfnAlloc dari pEncodePara adalah NULL, maka LocalAlloc digunakan untuk alokasi dan LocalFree harus dipanggil untuk membebaskan memori.

Jika pEncodePara dan anggota pfnAlloc dari pEncodePara bukan NULL, maka fungsi yang ditunjukkan oleh anggota pfnAlloc dari struktur CRYPT_ENCODE_PARA yang ditunjukkan oleh pEncodePara dipanggil untuk alokasi. Fungsi yang ditujukkan oleh anggota pfnFree dari pEncodePara harus dipanggil untuk membebaskan memori.

[out] pvEncoded

Penunjuk ke buffer untuk menerima struktur yang dikodekan. Ukuran buffer ini ditentukan dalam parameter pcbEncoded . Ketika buffer yang ditentukan tidak cukup besar untuk menerima struktur yang didekodekan, fungsi mengatur kode ERROR_MORE_DATA dan menyimpan ukuran buffer yang diperlukan, dalam byte, dalam variabel yang ditunjukkan oleh pcbEncoded.

Parameter ini dapat berupa NULL untuk mengambil ukuran buffer untuk tujuan alokasi memori. Untuk informasi selengkapnya, lihat Mengambil Data Dengan Panjang Tidak Diketahui.

Jika dwFlags berisi bendera CRYPT_ENCODE_ALLOC_FLAG , pvEncoded bukan penunjuk ke buffer tetapi merupakan alamat pointer ke buffer. Karena memori dialokasikan di dalam fungsi dan penunjuk disimpan dalam pvEncoded, pvEncoded tidak boleh NULL.

[in, out] pcbEncoded

Penunjuk ke variabel DWORD yang berisi ukuran, dalam byte, dari buffer yang diacu oleh parameter pvEncoded . Ketika fungsi kembali, variabel yang diacu oleh parameter pcbEncoded berisi jumlah byte yang dialokasikan dan dikodekan yang disimpan dalam buffer.

Ketika dwFlags berisi bendera CRYPT_ENCODE_ALLOC_FLAG , pcbEncoded adalah alamat penunjuk ke nilai DWORD yang diperbarui.

Catatan Saat memproses data yang dikembalikan dalam buffer, aplikasi harus menggunakan ukuran aktual data yang dikembalikan. Ukuran aktual bisa sedikit lebih kecil dari ukuran buffer yang ditentukan pada input. (Pada input, ukuran buffer biasanya ditentukan cukup besar untuk memastikan bahwa data output terbesar yang mungkin cocok dalam buffer.) Pada output, variabel yang diacu oleh parameter ini diperbarui untuk mencerminkan ukuran aktual data yang disalin ke buffer.
 

Mengembalikan nilai

Mengembalikan bukan nol jika berhasil atau nol sebaliknya.

Untuk informasi kesalahan yang diperluas, hubungi GetLastError. Tabel berikut menunjukkan beberapa kemungkinan kode kesalahan yang dapat dikembalikan dari GetLastError saat CryptEncodeObjectEx gagal.

Menampilkan kode Deskripsi
CRYPT_E_BAD_ENCODE
Terjadi kesalahan saat pengodean.
ERROR_FILE_NOT_FOUND
Fungsi pengodean tidak dapat ditemukan untuk dwCertEncodingType dan lpszStructType yang ditentukan.
ERROR_MORE_DATA
Jika buffer yang ditentukan oleh parameter pvEncoded tidak cukup besar untuk menyimpan data yang dikembalikan, fungsi mengatur kode ERROR_MORE_DATA dan menyimpan ukuran buffer yang diperlukan, dalam byte, dalam variabel yang ditunjukkan oleh pcbEncoded.
 

Jika fungsi gagal, GetLastError dapat mengembalikan kesalahan pengodean/pendekodean Abstract Syntax Notation One (ASN.1). Untuk informasi tentang kesalahan ini, lihat Nilai Pengembalian Pengodean/Pendekodean ASN.1.

Keterangan

Saat mengodekan objek kriptografi menggunakan fungsi CryptEncodeObjectEx pilihan, karakter NULL yang mengakhiri disertakan. Saat mendekode, menggunakan fungsi CryptDecodeObjectEx pilihan, karakter NULL yang mengakhiri tidak dipertahankan.

CryptEncodeObjectEx pertama-tama mencari fungsi pengodean yang diperluas yang dapat diinstal. Jika tidak ada fungsi pengodean yang diperluas yang ditemukan, fungsi lama yang tidak ada, dan dapat diinstal berada.

Ketika pengodean IA5String langsung objek tidak dimungkinkan, Anda dapat menentukan pengodean Punycode dengan mengatur parameter dwFlag ke nilai CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG . Mengatur bendera CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG memiliki efek yang berbeda berdasarkan jenis struktur yang dikodekan seperti yang ditentukan oleh nilai parameter lpszStructType .

Setiap konstanta dalam daftar di bawah ini memiliki jenis struktur terkait yang diacu oleh parameter pvStructInfo . Struktur yang menunjuk ke, secara langsung atau tidak langsung, memiliki referensi ke struktur CERT_ALT_NAME_ENTRY .

  • X509_ALTERNATE_NAME
  • szOID_AUTHORITY_INFO_ACCESS
  • X509_AUTHORITY_INFO_ACCESS
  • X509_AUTHORITY_KEY_ID2
  • szOID_AUTHORITY_KEY_IDENTIFIER2
  • szOID_CRL_DIST_POINTS
  • X509_CRL_DIST_POINTS
  • szOID_CROSS_CERT_DIST_POINTS
  • X509_CROSS_CERT_DIST_POINTS
  • szOID_ISSUER_ALT_NAME
  • szOID_ISSUER_ALT_NAME2
  • szOID_ISSUING_DIST_POINT
  • X509_ISSUING_DIST_POINT
  • szOID_NAME_CONSTRAINTS
  • X509_NAME_CONSTRAINTS
  • szOID_NEXT_UPDATE_LOCATION
  • OCSP_REQUEST
  • zOID_SUBJECT_ALT_NAME
  • szOID_SUBJECT_ALT_NAME2
Bendera CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG , bersama dengan nilai anggota dwAltNameChoice dari struktur CERT_ALT_NAME_ENTRY , menentukan cara di mana string dikodekan.
dwAltNameChoice Efek
CERT_ALT_NAME_DNS_NAME Jika nama host berisi karakter Unicode di luar kumpulan karakter ASCII, nama host pertama kali dikodekan dalam Punycode dan kemudian dikodekan sebagai string IA5String .
CERT_ALT_NAME_RFC822_NAME Jika bagian nama host alamat email berisi karakter Unicode di luar kumpulan karakter ASCII, bagian nama host alamat email dikodekan dalam Punycode. Alamat email yang dihasilkan kemudian dikodekan sebagai string IA5String .
CERT_ALT_NAME_URL Jika nama host server URI berisi karakter Unicode di luar kumpulan karakter ASCII, maka bagian nama host URI dikodekan dalam Punycode. Kemudian URI yang dihasilkan lolos, dan URL kemudian dikodekan sebagai string IA5String .
 

Setiap konstanta dalam daftar di bawah ini memiliki jenis struktur terkait yang diacu oleh parameter pvStructInfo . Struktur yang menunjuk ke, secara langsung atau tidak langsung, memiliki referensi ke struktur CERT_HASHED_URL .

  • szOID_BIOMETRIC_EXT
  • X509_BIOMETRIC_EXT
  • szOID_LOGOTYPE_EXT
  • X509_LOGOTYPE_EXT
Saat mengodekan nilai struktur CERT_HASHED_URL , jika nama host server URI berisi karakter Unicode di luar kumpulan karakter ASCII, dan CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG diatur, bagian nama host URI dikodekan dalam Punycode. Kemudian URI yang dihasilkan lolos, dan URL kemudian dikodekan sebagai string IA5String .

Setiap konstanta X509_UNICODE_NAME dalam daftar di bawah ini memiliki jenis struktur terkait yang diacu oleh parameter pvStructInfo .

  • X509_UNICODE_NAME
Jika anggota pszObjId dari struktur CERT_RDN_ATTR diatur ke szOID_RSA_emailAddr dan alamat email di anggota Nilai berisi karakter Unicode di luar kumpulan karakter ASCII, bagian nama host dari alamat email dikodekan dalam Punycode. Kemudian alamat email yang dihasilkan kemudian dikodekan sebagai string IA5String .

Dalam semua kasus, pengodean Punycode dari nama host dilakukan berdasarkan label-demi-label.

Contoh

Contoh berikut menunjukkan inisialisasi dan pengodean struktur X509_NAME menggunakan CryptEncodeObjectEx. Untuk contoh yang menyertakan konteks lengkap untuk contoh ini, lihat Contoh Program C: Pengodean dan Pendekodean ASN.1.

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#pragma comment(lib, "crypt32.lib")


#define MY_TYPE (X509_ASN_ENCODING)

void main()
{

//#define moved

//--------------------------------------------------------------------
//   Declare and initialize local variables.

char *Cert_Sub_Name ="Test User Name";

//--------------------------------------------------------------------
// Initialize a single RDN structure.

CERT_RDN_ATTR rgNameAttr = 
{
   "2.5.4.3",                      // The OID
   CERT_RDN_PRINTABLE_STRING,      // Type of string
   (DWORD)strlen(Cert_Sub_Name)+1, // String length including
                                   //  the terminating null character
   (BYTE *)Cert_Sub_Name           // Pointer to the string 
};
//--------------------------------------------------------------------
// Declare and initialize a structure to include
// the array of RDN structures.

CERT_RDN rgRDN[] = 
{
   1,               // The number of elements in the array
   &rgNameAttr      // Pointer to the array
};

//--------------------------------------------------------------------
//  Declare and initialize a CERT_NAME_INFO 
//  structure that includes a CERT_RND.

CERT_NAME_INFO CertName = 
{
    1,          // The number of elements in the CERT_RND's array
    rgRDN
};

//--------------------------------------------------------------------
//  Declare additional variables.

DWORD cbEncoded;              // Variable to hold the
                              //  length of the encoded string
BYTE *pbEncoded;              // Variable to hold a pointer to the 
                              //  encoded buffer
//--------------------------------------------------------------------
// Call CrypteEncodeObjectEx to get 
// length to allocate for pbEncoded.

if( CryptEncodeObjectEx(
     MY_TYPE,        // The encoding/decoding type
     X509_NAME,    
     &CertName,
     0,                 
     NULL, 
     NULL,
     &cbEncoded))    // Fill in the length needed for
                     // the encoded buffer.
{
     printf("The number of bytes needed is %d \n",cbEncoded);
}
else
{
     printf("The first call to the function failed.\n");
     exit(1);
}

if( pbEncoded = (BYTE*)malloc(cbEncoded))
{
     printf("Memory for pvEncoded has been allocated.\n");
}
else
{
    printf("Memory allocation failed.\n");
    exit(1);
}

if(CryptEncodeObjectEx(
     MY_TYPE,
     X509_NAME,
     &CertName,
     0,
     NULL, 
     pbEncoded,
     &cbEncoded))
{
     printf("The structure has been encoded.\n");
}
else
{
     printf("Encoding failed.");
     exit(1);
}
// Free allocated memory when done.
// ...
if(pbEncoded)
{
    free(pbEncoded);
}


Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header wincrypt.h
Pustaka Crypt32.lib
DLL Crypt32.dll

Lihat juga

CryptDecodeObject

CryptDecodeObjectEx

CryptEncodeObject

Fungsi Pengodean dan Pendekodean Objek