Condividi tramite


Funzione CryptEncodeObjectEx (wincrypt.h)

La funzione CryptEncodeObjectEx codifica una struttura del tipo indicato dal valore del parametro lpszStructType . Questa funzione offre un miglioramento significativo delle prestazioni rispetto a CryptEncodeObject supportando l'allocazione di memoria con il valore CRYPT_ENCODE_ALLOC_FLAG .

Sintassi

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
);

Parametri

[in] dwCertEncodingType

Tipo di codifica del certificato e tipo di codifica dei messaggi da utilizzare per codificare l'oggetto. Questo parametro può essere una combinazione di uno o più dei valori seguenti.

Valore Significato
PKCS_7_ASN_ENCODING
65536 (0x10000)
Specifica la codifica dei messaggi PKCS 7.
X509_ASN_ENCODING
1 (0x1)
Specifica la codifica del certificato X.509.

[in] lpszStructType

Puntatore a un identificatore di oggetto (OID) che definisce il tipo di struttura. Se la parola di ordine elevato del parametro lpszStructType è zero, la parola con ordine basso specifica un identificatore integer per il tipo della struttura specificata. In caso contrario, questo parametro è un puntatore a una stringa con terminazione Null che contiene la rappresentazione di stringa dell'OID.

Per altre informazioni sulle stringhe di identificatore di oggetto, sulle costanti predefinite e sulle strutture corrispondenti, vedere Costanti per CryptEncodeObject e CryptDecodeObject.

[in] pvStructInfo

Puntatore alla struttura da codificare. La struttura deve essere del tipo specificato da lpszStructType.

[in] dwFlags

Specifica le opzioni per la codifica. Questo parametro può essere zero o una combinazione di uno o più dei valori seguenti.

Valore Significato
CRYPT_ENCODE_ALLOC_FLAG
32768 (0x8000)
La funzione di codifica denominata alloca la memoria per i byte codificati. In pvEncoded viene restituito un puntatore ai byte allocati.
CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG
131072 (0x20000)
Questo flag è applicabile per abilitare la codifica Punycode di valori stringa Unicode. Per altre informazioni, vedere la sezione Osservazioni.

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Questo flag non è supportato.

CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAG
1073741824 (0x40000000)
Questo flag è applicabile quando si codificano X509_UNICODE_NAME, X509_UNICODE_NAME_VALUE o X509_UNICODE_ANY_STRING. Se questo flag è impostato, i caratteri non vengono controllati per determinare se sono validi per il tipo di valore specificato.
CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAG
2147483648 (0x80000000)
Questo flag è applicabile quando X509_UNICODE_NAME di codifica. Se questo flag è impostato e tutti i caratteri Unicode sono <= 0xFF, il CERT_RDN_T61_STRING viene selezionato anziché il CERT_RDN_UNICODE_STRING.
CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG
536870912 (0x20000000)
Questo flag è applicabile quando si codifica un X509_UNICODE_NAME. Se impostato, CERT_RDN_UTF8_STRING viene selezionato anziché CERT_RDN_UNICODE_STRING.
CRYPT_UNICODE_NAME_ENCODE_FORCE_UTF8_UNICODE_FLAG
268435456 (0x10000000)
Questo flag è applicabile quando si codifica un X509_UNICODE_NAME. Se impostato, CERT_RDN_UTF8_STRING viene selezionato anziché CERT_RDN_PRINTABLE_STRING per i tipi di stringa di directory. Inoltre, questo flag abilita CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG.

[in] pEncodePara

Puntatore a una struttura CRYPT_ENCODE_PARA che contiene informazioni di codifica. Questo parametro può essere NULL.

Se pEncodePara o il membro pfnAlloc di pEncodePara è NULL, viene usato LocalAlloc per l'allocazione e LocalFree deve essere chiamato per liberare la memoria.

Se sia pEncodePara che il membro pfnAlloc di pEncodePara non sono NULL, la funzione a cui punta il membro pfnAlloc della struttura CRYPT_ENCODE_PARA a cui punta pEncodePara viene chiamata per l'allocazione. La funzione a cui punta il membro pfnFree di pEncodePara deve essere chiamata per liberare la memoria.

[out] pvEncoded

Puntatore a un buffer per ricevere la struttura codificata. La dimensione di questo buffer viene specificata nel parametro pcbEncoded . Quando il buffer specificato non è sufficientemente grande da ricevere la struttura decodificata, la funzione imposta il codice ERROR_MORE_DATA e archivia le dimensioni del buffer necessarie, in byte, nella variabile a cui punta pcbEncoded.

Questo parametro può essere NULL per recuperare le dimensioni del buffer a scopo di allocazione della memoria. Per altre informazioni, vedere Recupero di dati di lunghezza sconosciuta.

Se dwFlags contiene il flag CRYPT_ENCODE_ALLOC_FLAG , pvEncoded non è un puntatore a un buffer, ma è l'indirizzo di un puntatore al buffer. Poiché la memoria viene allocata all'interno della funzione e il puntatore viene archiviato in pvEncoded, pvEncoded non può essere NULL.

[in, out] pcbEncoded

Puntatore a una variabile DWORD contenente le dimensioni, in byte, del buffer a cui punta il parametro pvEncoded . Quando la funzione viene restituita, la variabile a cui punta il parametro pcbEncoded contiene il numero di byte allocati e codificati archiviati nel buffer.

Quando dwFlags contiene il flag CRYPT_ENCODE_ALLOC_FLAG , pcbEncoded è l'indirizzo di un puntatore al valore DWORD aggiornato.

Nota Quando si elaborano i dati restituiti nel buffer, le applicazioni devono usare le dimensioni effettive dei dati restituiti. Le dimensioni effettive possono essere leggermente inferiori alle dimensioni del buffer specificato nell'input. In caso di input, le dimensioni del buffer vengono in genere specificate sufficientemente grandi per garantire che i dati di output più grandi possibili si adattino al buffer. Nell'output la variabile a cui punta questo parametro viene aggiornata in modo da riflettere le dimensioni effettive dei dati copiati nel buffer.
 

Valore restituito

Restituisce un valore diverso da zero se ha esito positivo o zero in caso contrario.

Per informazioni sugli errori estesi, chiamare GetLastError. La tabella seguente mostra alcuni possibili codici di errore che possono essere restituiti da GetLastError quando CryptEncodeObjectEx ha esito negativo.

Codice restituito Descrizione
CRYPT_E_BAD_ENCODE
Errore durante la codifica.
ERROR_FILE_NOT_FOUND
Impossibile trovare una funzione di codifica per l'oggetto dwCertEncodingType e lpszStructType specificato.
ERROR_MORE_DATA
Se il buffer specificato dal parametro pvEncoded non è sufficientemente grande da contenere i dati restituiti, la funzione imposta il codice ERROR_MORE_DATA e archivia le dimensioni del buffer necessarie, in byte, nella variabile a cui punta pcbEncoded.
 

Se la funzione ha esito negativo, GetLastError può restituire un errore di codifica/decodifica ASN.1 ( Abstract Syntax Notation One ). Per informazioni su questi errori, vedere Codifica ASN.1/Decodifica dei valori restituiti.

Commenti

Quando si codifica un oggetto di crittografia usando la funzione CryptEncodeObjectEx preferita, viene incluso il carattere NULL di terminazione. Durante la decodifica, usando la funzione CryptDecodeObjectEx preferita, il carattere NULL di terminazione non viene mantenuto.

CryptEncodeObjectEx cerca innanzitutto una funzione di codifica estesa installabile. Se non viene trovata alcuna funzione di codifica estesa, si trova la funzione precedente, non automatica, installabile.

Quando la codifica IA5String diretta dell'oggetto non è possibile, è possibile specificare la codifica Punycode impostando il parametro dwFlag sul valore CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG . L'impostazione del flag CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG ha effetti diversi in base al tipo di struttura codificato come specificato dal valore del parametro lpszStructType .

Ogni costante nell'elenco seguente ha un tipo di struttura associato a cui punta il parametro pvStructInfo . La struttura a cui punta, direttamente o indirettamente, ha un riferimento a una struttura 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
Il flag CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG , insieme al valore del membro dwAltNameChoice della struttura CERT_ALT_NAME_ENTRY , determina la modalità in cui vengono codificate le stringhe.
dwAltNameChoice Effetto
CERT_ALT_NAME_DNS_NAME Se il nome host contiene caratteri Unicode all'esterno del set di caratteri ASCII, il nome host viene prima codificato in Punycode e quindi codificato come stringa IA5String .
CERT_ALT_NAME_RFC822_NAME Se la parte del nome host dell'indirizzo di posta elettronica contiene caratteri Unicode all'esterno del set di caratteri ASCII, la parte del nome host dell'indirizzo di posta elettronica viene codificata in Punycode. L'indirizzo di posta elettronica risultante viene quindi codificato come stringa IA5String .
CERT_ALT_NAME_URL Se il nome host del server dell'URI contiene caratteri Unicode all'esterno del set di caratteri ASCII, la parte del nome host dell'URI viene codificata in Punycode. Viene quindi eseguito l'escape dell'URI risultante e l'URL viene quindi codificato come stringa IA5String .
 

Ogni costante nell'elenco seguente ha un tipo di struttura associato a cui punta il parametro pvStructInfo . La struttura a cui punta, direttamente o indirettamente, ha un riferimento a una struttura CERT_HASHED_URL .

  • szOID_BIOMETRIC_EXT
  • X509_BIOMETRIC_EXT
  • szOID_LOGOTYPE_EXT
  • X509_LOGOTYPE_EXT
Quando si codifica il valore della struttura CERT_HASHED_URL , se il nome host del server dell'URI contiene caratteri Unicode all'esterno del set di caratteri ASCII e la CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG è impostata, la parte del nome host dell'URI viene codificata in Punycode. Viene quindi eseguito l'escape dell'URI risultante e l'URL viene quindi codificato come stringa IA5String .

Ogni costante X509_UNICODE_NAME nell'elenco seguente ha un tipo di struttura associato a cui punta il parametro pvStructInfo .

  • X509_UNICODE_NAME
Se il membro pszObjId della struttura CERT_RDN_ATTR è impostato su szOID_RSA_emailAddr e l'indirizzo di posta elettronica nel membro Value contiene caratteri Unicode all'esterno del set di caratteri ASCII, la parte del nome host dell'indirizzo di posta elettronica viene codificata in Punycode. L'indirizzo di posta elettronica risultante viene quindi codificato come stringa IA5String .

In tutti i casi, la codifica Punycode del nome host viene eseguita in base all'etichetta.

Esempio

L'esempio seguente illustra l'inizializzazione e la codifica di una struttura X509_NAME usando CryptEncodeObjectEx. Per un esempio che include il contesto completo per questo esempio, vedere Esempio di programma C: codifica ASN.1 e decodifica.

#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);
}


Requisiti

Requisito Valore
Client minimo supportato Windows XP [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione wincrypt.h
Libreria Crypt32.lib
DLL Crypt32.dll

Vedi anche

CryptDecodeObject

CryptDecodeObjectEx

CryptEncodeObject

Funzioni di codifica e decodifica degli oggetti