Función CryptDuplicateKey (wincrypt.h)
Sintaxis
BOOL CryptDuplicateKey(
[in] HCRYPTKEY hKey,
[in] DWORD *pdwReserved,
[in] DWORD dwFlags,
[out] HCRYPTKEY *phKey
);
Parámetros
[in] hKey
Identificador de la clave que se va a duplicar.
[in] pdwReserved
Reservado para uso futuro y debe ser NULL.
[in] dwFlags
Reservado para uso futuro y debe ser cero.
[out] phKey
Dirección del identificador a la clave duplicada. Cuando haya terminado de usar la clave, libere el identificador llamando a la función CryptDestroyKey .
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.
El código de error precedido por "NTE" lo genera el CSP en particular que se usa. Algunos códigos de error posibles se enumeran en la tabla siguiente.
Código devuelto | Descripción |
---|---|
|
Dado que se trata de una nueva función, es posible que los CSP existentes no lo implementen. Este error se devuelve si el CSP no admite esta función. |
|
Uno de los parámetros contiene un valor que no es válido. Suele ser un puntero que no es válido. |
|
Un identificador de la clave original no es válido. |
Comentarios
CryptDuplicateKey realiza una copia de una clave y el estado exacto de la clave. Un escenario en el que se puede usar esta función es cuando una aplicación necesita cifrar dos mensajes independientes con la misma clave, pero con valores de sal diferentes. La clave original se genera y, a continuación, se realiza una clave duplicada mediante la función CryptDuplicateKey . A continuación, los distintos valores de sal se establecen en las claves originales y duplicadas con llamadas independientes a la función CryptSetKeyParam .
Se debe llamar a CryptDestroyKey para destruir las claves creadas mediante CryptDuplicateKey. Destruir la clave original no hace que se destruya la clave duplicada. Una vez realizada una clave duplicada, es independiente de la clave original. No hay ningún estado compartido entre las dos claves.
Ejemplos
En el ejemplo siguiente se muestra la creación de una clave de sesión que es un duplicado de una clave de sesión existente. Para obtener un ejemplo que incluya el contexto completo de este ejemplo, vea Ejemplo de programa C: duplicación de una clave de sesión.
//--------------------------------------------------------------------
// Declare and initialize variables.
HCRYPTKEY hDuplicateKey;
// Duplicate the key. hOriginalKey is a previously
// assigned HCRYPTKEY variable.
if (CryptDuplicateKey(
hOriginalKey,
NULL,
0,
&hDuplicateKey))
{
printf("The session key has been duplicated. \n");
}
else
{
printf("Error using CryptDuplicateKey.\n");
exit(1);
}
// Insert code that uses the duplicate key here.
// When you have finished using the key, the handle must be released.
if (CryptDestroyKey(hDuplicateKey))
{
printf("The handle has been released.\n");
}
else
{
printf("The handle could not be released.\n");
}
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 |