Compartilhar via


Função NCryptStreamUpdate (ncryptprotect.h)

A função NCryptStreamUpdate criptografa e descriptografa blocos de dados.

Sintaxe

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

Parâmetros

[in] hStream

Manipule para o objeto de fluxo criado chamando NCryptStreamOpenToProtect ou NCryptStreamOpenToUnprotect.

[in] pbData

Ponteiro para a matriz de bytes a ser processada.

cbData

Número de bytes na matriz binária especificada pelo parâmetro pbData .

fFinal

Um valor booliano que especifica se o último bloco de dados foi processado.

Retornar valor

Retorna um código status que indica o êxito ou a falha da função. Os códigos de retorno possíveis incluem, mas não se limitam a, o seguinte.

Código de retorno Descrição
ERROR_SUCCESS
A função foi bem-sucedida.
NTE_BAD_DATA
Não foi possível decodificar o conteúdo.
NTE_INVALID_HANDLE
O identificador de fluxo apontado pelo parâmetro hStream não é válido.
NTE_NO_MEMORY
Não havia memória suficiente disponível para processar o conteúdo.

Comentários

Você deve chamar NCryptStreamOpenToProtect ou NCryptStreamOpenToUnprotect para abrir um fluxo antes de chamar NCryptStreamUpdate

As mensagens podem ser tão grandes que processá-las todas de uma só vez armazenando toda a mensagem na memória pode ser difícil. No entanto, é possível processar mensagens grandes particionando os dados a serem processados em blocos gerenciáveis.

Para fazer isso, use NCryptStreamUpdate em um loop que avança pelo bloco de arquivos por bloco. À medida que a mensagem transmitida é processada, os dados de saída resultantes são passados de volta para seu aplicativo usando uma função de retorno de chamada que você especificar. Isso é demonstrado no exemplo a seguir. Para obter mais informações sobre a função de retorno de chamada, consulte PFNCryptStreamOutputCallback.

Nota É recomendável não usar um tamanho de bloco muito pequeno. Blocos pequenos exigem mais chamadas e, portanto, mais sobrecarga de chamada. Além disso, as APIs de streaming são otimizadas para blocos maiores. Você deve experimentar para encontrar o melhor tamanho de bloco para os dados que você deve processar.
 
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 Valor
Cliente mínimo com suporte Windows 8 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2012 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho ncryptprotect.h
Biblioteca NCrypt.lib
DLL NCrypt.dll

Confira também

Funções DPAPI do CNG

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect