Función CryptGetProvParam (wincrypt.h)

Importante Esta API está en desuso. El software nuevo y existente debe empezar a usar las API cryptography Next Generation. Microsoft puede quitar esta API en futuras versiones.
 
La función CryptGetProvParam recupera parámetros que rigen las operaciones de un proveedor de servicios criptográficos (CSP).

Sintaxis

BOOL CryptGetProvParam(
  [in]      HCRYPTPROV hProv,
  [in]      DWORD      dwParam,
  [out]     BYTE       *pbData,
  [in, out] DWORD      *pdwDataLen,
  [in]      DWORD      dwFlags
);

Parámetros

[in] hProv

Identificador del destino csp de la consulta. Este identificador debe haberse creado mediante la función CryptAcquireContext .

[in] dwParam

Naturaleza de la consulta. Se definen las siguientes consultas.

Valor Significado
PP_ADMIN_PIN
31 (0x1F)
Devuelve el número de identificación personal (PIN) del administrador en el parámetro pbData como LPSTR.
PP_APPLI_CERT
18 (0x12)
Esta constante no se usa.
PP_CHANGE_PASSWORD
7 (0x7)
Esta constante no se usa.
PP_CERTCHAIN
9 (0x9)
Devuelve la cadena de certificados asociada al identificador hProv . La cadena de certificados devuelta se X509_ASN_ENCODING codifica.
PP_CONTAINER
6 (0x6)
Nombre del contenedor de claves actual como una cadena CHAR terminada en null. Esta cadena es exactamente la misma que la pasada en el parámetro pszContainer de la función CryptAcquireContext para especificar el contenedor de claves que se va a usar. El parámetro pszContainer se puede leer para determinar el nombre del contenedor de claves predeterminado.
PP_CRYPT_COUNT_KEY_USE
41 (0x29)
No implementado por los CSP de Microsoft. Otros CSP pueden implementar este comportamiento.

Windows XP: Este parámetro no se admite.

PP_ENUMALGS
1 (0x1)
Estructura PROV_ENUMALGS que contiene información sobre un algoritmo admitido por el CSP que se consulta.

La primera vez que se lee este valor, el parámetro dwFlags debe contener la marca CRYPT_FIRST . Al hacerlo, esta función recuperará el primer elemento de la enumeración. Los elementos posteriores se pueden recuperar estableciendo la marca CRYPT_NEXT en el parámetro dwFlags . Cuando se produce un error en esta función con el código de error ERROR_NO_MORE_ITEMS , se ha alcanzado el final de la enumeración.

Esta función no es segura para subprocesos y es posible que todos los algoritmos disponibles no se enumeren si esta función se usa en un contexto multiproceso.

PP_ENUMALGS_EX
22 (0x16)
Estructura PROV_ENUMALGS_EX que contiene información sobre un algoritmo admitido por el CSP que se consulta. La estructura devuelta contiene más información sobre el algoritmo que la estructura devuelta para PP_ENUMALGS.

La primera vez que se lee este valor, el parámetro dwFlags debe contener la marca CRYPT_FIRST . Al hacerlo, esta función recuperará el primer elemento de la enumeración. Los elementos posteriores se pueden recuperar estableciendo la marca CRYPT_NEXT en el parámetro dwFlags . Cuando se produce un error en esta función con el código de error ERROR_NO_MORE_ITEMS , se ha alcanzado el final de la enumeración.

Esta función no es segura para subprocesos y es posible que todos los algoritmos disponibles no se enumeren si esta función se usa en un contexto multiproceso.

PP_ENUMCONTAINERS
2 (0x2)
Nombre de uno de los contenedores de claves mantenidos por el CSP en forma de una cadena CHAR terminada en null.

La primera vez que se lee este valor, el parámetro dwFlags debe contener la marca CRYPT_FIRST . Al hacerlo, esta función recuperará el primer elemento de la enumeración. Los elementos posteriores se pueden recuperar estableciendo la marca CRYPT_NEXT en el parámetro dwFlags . Cuando se produce un error en esta función con el código de error ERROR_NO_MORE_ITEMS , se ha alcanzado el final de la enumeración.

Para enumerar los contenedores de claves asociados a un equipo, llame primero a CryptAcquireContext mediante la marca CRYPT_MACHINE_KEYSET y, a continuación, use el identificador devuelto desde CryptAcquireContext como parámetro hProv en la llamada a CryptGetProvParam.

Esta función no es segura para subprocesos y es posible que todos los algoritmos disponibles no se enumeren si esta función se usa en un contexto multiproceso.

PP_ENUMELECTROOTS
26 (0x1A)
Esta constante no se usa.
PP_ENUMEX_SIGNING_PROT
40 (0x28)
Indica que el CSP actual admite el miembro dwProtocols de la estructura PROV_ENUMALGS_EX . Si esta función se ejecuta correctamente, el CSP admite el miembro dwProtocols de la estructura PROV_ENUMALGS_EX . Si se produce un error en esta función con un código de error NTE_BAD_TYPE , el CSP no admite el miembro dwProtocols .
PP_ENUMMANDROOTS
25 (0x19)
Esta constante no se usa.
PP_IMPTYPE
3 (0x3)
Valor DWORD que indica cómo se implementa el CSP. Para obtener una tabla de valores posibles, vea Comentarios.
PP_KEY_TYPE_SUBTYPE
10 (0xA)
Esta consulta no se usa.
PP_KEYEXCHANGE_PIN
32 (0x20)
Especifica que el PIN de intercambio de claves está incluido en pbData. El PIN se representa como una cadena ASCII terminada en null.
PP_KEYSET_SEC_DESCR
8 (0x8)
Recupera el descriptor de seguridad del contenedor de almacenamiento de claves. El parámetro pbData es la dirección de una estructura de SECURITY_DESCRIPTOR que recibe el descriptor de seguridad para el contenedor de almacenamiento de claves. El descriptor de seguridad se devuelve en formato relativo propio.
PP_KEYSET_TYPE
27 (0x1B)
Determina si el parámetro hProv es un conjunto de claves de equipo. El parámetro pbData debe ser un DWORD; DWORD se establecerá en la marca CRYPT_MACHINE_KEYSET si esa marca se pasó a la función CryptAcquireContext .
PP_KEYSPEC
39 (0x27)
Devuelve información sobre los valores del especificador de clave que admite el CSP. Los valores del especificador de clave se combinan en un OR lógico y se devuelven en el parámetro pbData de la llamada como DWORD. Por ejemplo, la versión 1.0 del proveedor criptográfico base de Microsoft devuelve un valor DWORD de AT_SIGNATURE | AT_KEYEXCHANGE.
PP_KEYSTORAGE
17 (0x11)
Devuelve un valor DWORD de CRYPT_SEC_DESCR.
PP_KEYX_KEYSIZE_INC
35 (0x23)
Número de bits para la longitud de incremento de AT_KEYEXCHANGE. Esta información se usa con la información devuelta en el valor de PP_ENUMALGS_EX. Con la información devuelta al usar PP_ENUMALGS_EX y PP_KEYX_KEYSIZE_INC, se pueden determinar las longitudes de clave válidas para AT_KEYEXCHANGE. Estas longitudes de clave se pueden usar con CryptGenKey. Por ejemplo, si un CSP enumera CALG_RSA_KEYX (AT_KEYEXCHANGE) con una longitud de clave mínima de 512 bits y un máximo de 1024 bits, y devuelve la longitud de incremento como 64 bits, las longitudes de clave válidas son 512, 576, 640,... 1024.
PP_NAME
4 (0x4)
Nombre del CSP en forma de cadena CHAR terminada en null. Esta cadena es idéntica a la que se pasa en el parámetro pszProvider de la función CryptAcquireContext para especificar que se use el CSP actual.
PP_PROVTYPE
16 (0x10)
Valor DWORD que indica el tipo de proveedor del CSP.
PP_ROOT_CERTSTORE
46 (0x2E)
Obtiene el almacén de certificados raíz de la tarjeta inteligente. Este almacén de certificados contiene todos los certificados raíz almacenados en la tarjeta inteligente.

El parámetro pbData es la dirección de una variable HCERTSTORE que recibe el identificador del almacén de certificados. Cuando este identificador ya no es necesario, el autor de la llamada debe cerrarlo mediante la función CertCloseStore .

Windows Server 2003 y Windows XP: Este parámetro no se admite.

PP_SESSION_KEYSIZE
20 (0x14)
Tamaño, en bits, de la clave de sesión.
PP_SGC_INFO
37 (0x25)
Se usa con criptografía controlada por el servidor.
PP_SIG_KEYSIZE_INC
34 (0x22)
Número de bits para la longitud de incremento de AT_SIGNATURE. Esta información se usa con la información devuelta en el valor de PP_ENUMALGS_EX. Con la información devuelta al usar PP_ENUMALGS_EX y PP_SIG_KEYSIZE_INC, se pueden determinar las longitudes de clave válidas para AT_SIGNATURE. Estas longitudes de clave se pueden usar con CryptGenKey.

Por ejemplo, si un CSP enumera CALG_RSA_SIGN (AT_SIGNATURE) con una longitud de clave mínima de 512 bits y un máximo de 1024 bits, y devuelve la longitud de incremento como 64 bits, las longitudes de clave válidas son 512, 576, 640,... 1024.

PP_SIGNATURE_PIN
33 (0x21)
Especifica que el PIN de firma de clave está incluido en pbData. El PIN se representa como una cadena ASCII terminada en null.
PP_SMARTCARD_GUID
45 (0x2D)
Obtiene el identificador de la tarjeta inteligente. El parámetro pbData es la dirección de una estructura GUID que recibe el identificador de la tarjeta inteligente.

Windows Server 2003 y Windows XP: Este parámetro no se admite.

PP_SMARTCARD_READER
43 (0x2B)
Obtiene el nombre del lector de tarjetas inteligentes. El parámetro pbData es la dirección de una matriz de caracteres ANSI que recibe una cadena ANSI terminada en null que contiene el nombre del lector de tarjetas inteligentes. El tamaño de este búfer, contenido en la variable a la que apunta el parámetro pdwDataLen , debe incluir el terminador NULL .

Windows Server 2003 y Windows XP: Este parámetro no se admite.

PP_SYM_KEYSIZE
19 (0x13)
Tamaño de la clave simétrica.
PP_UI_PROMPT
21 (0x15)
Esta consulta no se usa.
PP_UNIQUE_CONTAINER
36 (0x24)
Nombre de contenedor único del contenedor de claves actual en forma de cadena CHAR terminada en null. Para muchos CSP, este nombre es el mismo nombre que se devuelve cuando se usa el valor de PP_CONTAINER. La función CryptAcquireContext debe funcionar con este nombre de contenedor.
PP_USE_HARDWARE_RNG
38 (0x26)
Indica si se admite un generador de números aleatorios de hardware (RNG). Cuando se especifica PP_USE_HARDWARE_RNG , la función se realiza correctamente y devuelve TRUE si se admite un RNG de hardware. La función produce un error y devuelve FALSE si no se admite un RNG de hardware. Si se admite un RNG, PP_USE_HARDWARE_RNG se puede establecer en CryptSetProvParam para indicar que el CSP debe usar exclusivamente el RNG de hardware para este contexto de proveedor. Cuando se usa PP_USE_HARDWARE_RNG , el parámetro pbData debe ser NULL y dwFlags debe ser cero.

Ninguno de los CSP de Microsoft admite actualmente el uso de un RNG de hardware.

PP_USER_CERTSTORE
42 (0x2A)
Obtiene el almacén de certificados de usuario para la tarjeta inteligente. Este almacén de certificados contiene todos los certificados de usuario almacenados en la tarjeta inteligente. Los certificados de este almacén se codifican mediante PKCS_7_ASN_ENCODING o X509_ASN_ENCODING codificación y deben contener la propiedad CERT_KEY_PROV_INFO_PROP_ID .

El parámetro pbData es la dirección de una variable HCERTSTORE que recibe el identificador de un almacén de certificados en memoria. Cuando este identificador ya no es necesario, el autor de la llamada debe cerrarlo mediante la función CertCloseStore .

Windows Server 2003 y Windows XP: Este parámetro no se admite.

PP_VERSION
5 (0x5)
Número de versión del CSP. El byte menos significativo contiene el número de versión secundaria y el siguiente byte más significativo el número de versión principal. La versión 2.0 se representa como 0x00000200. Para mantener la compatibilidad con versiones anteriores del proveedor criptográfico base de Microsoft y el proveedor criptográfico mejorado de Microsoft, los nombres de proveedor conservan la designación "v1.0" en versiones posteriores.

[out] pbData

Puntero a un búfer para recibir los datos. El formato de estos datos varía en función del valor de dwParam. Cuando dwParam se establece en PP_USE_HARDWARE_RNG, pbData debe establecerse en NULL.

Este parámetro puede ser NULL para establecer el tamaño de esta información con fines de asignación de memoria. Para obtener más información, vea Recuperar datos de longitud desconocida.

[in, out] pdwDataLen

Puntero a un valor DWORD que especifica el tamaño, en bytes, del búfer al que apunta el parámetro pbData . Cuando la función devuelve, el valor DWORD contiene el número de bytes almacenados o que se almacenarán en el búfer.

Nota Al procesar los datos devueltos en el búfer, las aplicaciones deben usar el tamaño real de los datos devueltos. El tamaño real puede ser ligeramente menor que el tamaño del búfer especificado en la entrada. (En la entrada, los tamaños del búfer suelen especificarse lo suficientemente grandes como para asegurarse de que los datos de salida más grandes posibles se ajusten al búfer). En la salida, la variable a la que apunta este parámetro se actualiza para reflejar el tamaño real de los datos copiados en el búfer.

Si se establece PP_ENUMALGS o PP_ENUMALGS_EX, el parámetro pdwDataLen funciona de forma algo diferente. Si pbData es NULL o el valor al que apunta pdwDataLen es demasiado pequeño, el valor devuelto en este parámetro es el tamaño del elemento más grande de la lista de enumeraciones en lugar del tamaño del elemento que se está leyendo actualmente.

Si se establece PP_ENUMCONTAINERS, la primera llamada a la función devuelve el tamaño del contenedor de claves máximo permitido por el proveedor actual. Esto contrasta con otros comportamientos posibles, como devolver la longitud del contenedor existente más largo o la longitud del contenedor actual. Las llamadas de enumeración posteriores no cambiarán el parámetro dwLen . Para cada contenedor enumerado, el autor de la llamada puede determinar la longitud de la cadena terminada en NULL mediante programación, si lo desea. Si se lee uno de los valores de enumeración y el parámetro pbData es NULL, se debe especificar la marca CRYPT_FIRST para que la información de tamaño se recupere correctamente.

 

[in] dwFlags

Si dwParam está PP_KEYSET_SEC_DESCR, se recupera el descriptor de seguridad en el contenedor de claves donde se almacenan las claves. En este caso, dwFlags se usa para pasar las marcas de bits de SECURITY_INFORMATION que indican la información de seguridad solicitada, tal como se define en el SDK de plataforma. SECURITY_INFORMATION marcas de bits se pueden combinar con una operación OR bit a bit.

Los siguientes valores se definen para su uso con PP_KEYSET_SEC_DESCR.

Valor Significado
OWNER_SECURITY_INFORMATION
Se hace referencia al identificador de propietario del objeto.
GROUP_SECURITY_INFORMATION
Se hace referencia al identificador de grupo principal del objeto.
DACL_SECURITY_INFORMATION
Se hace referencia a la ACL discrecional del objeto.
SACL_SECURITY_INFORMATION
Se hace referencia a la ACL del sistema del objeto.
 

Los siguientes valores se definen para su uso con PP_ENUMALGS, PP_ENUMALGS_EX y PP_ENUMCONTAINERS.

Valor Significado
CRYPT_FIRST
1 (0x1)
Recupere el primer elemento de la enumeración . Esto tiene el mismo efecto que restablecer el enumerador.
CRYPT_NEXT
2 (0x2)
Recupere el siguiente elemento de la enumeración . Cuando no hay más elementos que recuperar, se producirá un error en esta función y se establecerá el último error en ERROR_NO_MORE_ITEMS.
CRYPT_SGC_ENUM
4 (0x4)
Recupere certificados habilitados para criptografía controlada por el servidor (SGC). Los certificados habilitados para SGC ya no se admiten.
CRYPT_SGC
Esta marca no se usa.
CRYPT_FASTSGC
Esta marca no se usa.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es distinto de cero (TRUE).

Si se produce un error en la función, el valor devuelto es cero (FALSE). Para obtener información de error extendida, llame a GetLastError.

Los códigos de error precedidos por NTE se generan mediante el CSP concreto que se usa. A continuación se indican algunos códigos de error posibles.

Código devuelto Descripción
ERROR_INVALID_HANDLE
Uno de los parámetros especifica un identificador que no es válido.
ERROR_INVALID_PARAMETER
Uno de los parámetros contiene un valor que no es válido. Suele ser un puntero que no es válido.
ERROR_MORE_DATA
Si el búfer especificado por el parámetro pbData no es lo suficientemente grande como para contener los datos devueltos, la función establece el código ERROR_MORE_DATA y almacena el tamaño de búfer necesario, en bytes, en la variable a la que apunta pdwDataLen.
ERROR_NO_MORE_ITEMS
Se ha alcanzado el final de la lista de enumeraciones. No se han colocado datos válidos en el búfer pbData . Este código de error solo se devuelve cuando dwParam es igual a PP_ENUMALGS o PP_ENUMCONTAINERS.
NTE_BAD_FLAGS
El parámetro dwFlags especifica una marca que no es válida.
NTE_BAD_TYPE
El parámetro dwParam especifica un número de valor desconocido.
NTE_BAD_UID
El contexto de CSP especificado por hProv no es válido.

Comentarios

Esta función no se debe usar en un subproceso de un programa multiproceso.

Los valores siguientes se devuelven en pbData si dwParam es PP_IMPTYPE.

Valor Significado
CRYPT_IMPL_HARDWARE
0x01
La implementación está en hardware.
CRYPT_IMPL_SOFTWARE
0x02
La implementación está en software.
CRYPT_IMPL_MIXED
0x03
La implementación implica hardware y software.
CRYPT_IMPL_UNKNOWN
0x04
El tipo de implementación es desconocido.
CRYPT_IMPL_REMOVABLE
0x08
La implementación está en medios extraíbles.
 

El parámetro dwFlags se usa para pasar las marcas de bits de SECURITY_INFORMATION que indican la información de seguridad solicitada. El puntero al descriptor de seguridad se devuelve en el parámetro pbData y la longitud del descriptor de seguridad se devuelve en el parámetro pdwDataLen . La seguridad del contenedor de claves se controla con SetFileSecurity y GetFileSecurity.

Se puede determinar la clase de un algoritmo enumerado con dwParam establecido en PP_ENUMALGS o PP_ENUMALGS_EX. Esto puede hacerse para mostrar una lista de algoritmos de cifrado admitidos y para ignorar el resto. La macro GET_ALG_CLASS(x) toma un identificador de algoritmo como argumento y devuelve un código que indica la clase general de ese algoritmo. Entre los posibles valores devueltos se incluyen:

  • ALG_CLASS_DATA_ENCRYPT
  • ALG_CLASS_HASH
  • ALG_CLASS_KEY_EXCHANGE
  • ALG_CLASS_SIGNATURE

En la tabla siguiente se enumeran los algoritmos admitidos por el proveedor criptográfico base de Microsoft junto con la clase de cada algoritmo.

Nombre Identificador Clase
"MD2" CALG_MD2 ALG_CLASS_HASH
"MD5" CALG_MD5 ALG_CLASS_HASH
"SHA" CALG_SHA ALG_CLASS_HASH
"MAC" CALG_MAC ALG_CLASS_HASH
"RSA_SIGN" CALG_RSA_SIGN ALG_CLASS_SIGNATURE
"RSA_KEYX" CALG_RSA_KEYX ALG_CLASS_KEY_EXCHANGE
"RC2" CALG_RC2 ALG_CLASS_DATA_ENCRYPT
"RC4" CALG_RC4 ALG_CLASS_DATA_ENCRYPT
 

Las aplicaciones no deben usar un algoritmo con un identificador de algoritmo que no se reconozca. El uso de un algoritmo criptográfico desconocido puede producir resultados imprevisibles.

Ejemplos

En el ejemplo siguiente se muestra cómo buscar el nombre del CSP asociado a un identificador de proveedor de servicios criptográficos y el nombre del contenedor de claves asociado al identificador. Para obtener el contexto completo de este ejemplo, vea Ejemplo de programa C: Uso de CryptAcquireContext.

Para obtener otro ejemplo que usa esta función, vea Programa C de ejemplo: Enumeración de proveedores y tipos de proveedor de CSP.

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

HCRYPTPROV hCryptProv;
BYTE       pbData[1000];       // 1000 will hold the longest 
                               // key container name.
DWORD cbData;

//-------------------------------------------------------------------
// An HCRYPTPROV must be acquired before using code like that in 
// "Example C Program Using CryptAcquireContext."

//-------------------------------------------------------------------
// Read the name of the default CSP.

cbData = 1000;
if(CryptGetProvParam(
    hCryptProv, 
    PP_NAME, 
    pbData, 
    &cbData, 
    0))
{
    printf("CryptGetProvParam succeeded.\n");
    printf("Provider name: %s\n", pbData);
}
else
{
    printf("Error reading CSP name. \n");
    exit(1);
}
//--------------------------------------------------------------------
// Read the name of the default key container.

cbData = 1000;
if(CryptGetProvParam(
    hCryptProv, 
    PP_CONTAINER, 
    pbData, 
    &cbData, 
    0))
{
    printf("CryptGetProvParam succeeded. \n");
    printf("Key Container name: %s\n", pbData);
}
else
{
    printf("Error reading key container name. \n");
    exit(1);
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado wincrypt.h
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

Descriptores de seguridad absolutos y Self-Relative

CryptAcquireContext

CryptCreateHash

CryptDeriveKey

CryptGenKey

CryptGetKeyParam

CryptSetProvParam

Funciones del proveedor de servicios