Función NCryptStreamUpdate (ncryptprotect.h)

La función NCryptStreamUpdate cifra y descifra bloques de datos.

Sintaxis

SECURITY_STATUS NCryptStreamUpdate(
  [in] NCRYPT_STREAM_HANDLE hStream,
  [in] const BYTE           *pbData,
       SIZE_T               cbData,
       BOOL                 fFinal
);

Parámetros

[in] hStream

Controle el objeto de secuencia creado llamando a NCryptStreamOpenToProtect o NCryptStreamOpenToUnprotect.

[in] pbData

Puntero a la matriz de bytes que se va a procesar.

cbData

Número de bytes de la matriz binaria especificada por el parámetro pbData .

fFinal

Valor booleano que especifica si se ha procesado el último bloque de datos.

Valor devuelto

Devuelve un código de estado que indica el éxito o error de la función. Entre los códigos de retorno posibles se incluyen, entre otros, los siguientes.

Código devuelto Descripción
ERROR_SUCCESS
La función se realizó correctamente.
NTE_BAD_DATA
No se pudo descodificar el contenido.
NTE_INVALID_HANDLE
El identificador de secuencia al que apunta el parámetro hStream no es válido.
NTE_NO_MEMORY
No había memoria suficiente disponible para procesar el contenido.

Comentarios

Debe llamar a NCryptStreamOpenToProtect o NCryptStreamOpenToUnprotect para abrir una secuencia antes de llamar a NCryptStreamUpdate.

Los mensajes pueden ser tan grandes que procesarlos a la vez almacenando todo el mensaje en la memoria puede ser difícil. Sin embargo, es posible procesar mensajes de gran tamaño mediante la creación de particiones de los datos que se van a procesar en bloques administrables.

Para ello, use NCryptStreamUpdate en un bucle que avanza a través del bloque de archivos por bloque. A medida que se procesa el mensaje transmitido, los datos de salida resultantes se devuelven a la aplicación mediante una función de devolución de llamada que especifique. Esto se muestra en el siguiente ejemplo. Para obtener más información sobre la función de devolución de llamada, consulte PFNCryptStreamOutputCallback.

Nota Se recomienda usar demasiado pequeño de un tamaño de bloque. Los bloques pequeños requieren más llamadas y, por tanto, más sobrecarga de llamadas. Además, las API de streaming están optimizadas para bloques más grandes. Debe experimentar para encontrar el mejor tamaño de bloque para los datos que debe procesar.
 
BOOL                        fFinal = FALSE;
PBYTE                       pbBuf = NULL;

// Determine the number of bytes to read.
DWORD cbData = GetFileSize( hFileIn, NULL );

// Call NCryptStreamUpdate while there is data left to read.
while(FALSE == fFinal)
{
    // Read dwBlockSize bytes from the file.
    if(dwBlockSize > 1)
    {
        if( !ReadFile(hFileIn, pbBuf, dwBlockSize, &cbResult, NULL) )
        {
            hr = HRESULT_FROM_WIN32(hr);            
            goto CleanUp;
        }
    }

    // Decrement the number of bytes to read by the current amount read.
    cbData -= cbResult;

    // Set fFinal if there are no bytes left to read.
    if (cbData <= 0) fFinal = TRUE;

    // Encrypt (or decrypt) the bytes pointed to by pbBuf
    hr = NCryptStreamUpdate(hStream, pbBuf, cbResult, fFinal); 
    if( FAILED(hr) )
    {            
        goto CleanUp;
    }         
}      

CleanUp:
    if( NULL != hStream )
    {
        NCryptStreamClose(hStream);
    }
    if( NULL != hDescriptor )
    {
        NCryptCloseProtectionDescriptor( hDescriptor );
    }
    if(NULL != pbBuf)
    {
        LocalFree(pbBuf);
        pbBuf = NULL;
    }

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8 [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2012 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado ncryptprotect.h
Library NCrypt.lib
Archivo DLL NCrypt.dll

Consulte también

Funciones dpAPI de CNG

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect