Partager via


Fonction NCryptStreamUpdate (ncryptprotect.h)

La fonction NCryptStreamUpdate chiffre et déchiffre les blocs de données.

Syntaxe

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

Paramètres

[in] hStream

Gérez l’objet de flux créé en appelant NCryptStreamOpenToProtect ou NCryptStreamOpenToUnprotect.

[in] pbData

Pointeur vers le tableau d’octets à traiter.

cbData

Nombre d’octets dans le tableau binaire spécifié par le paramètre pbData .

fFinal

Valeur booléenne qui spécifie si le dernier bloc de données a été traité.

Valeur retournée

Retourne un code status qui indique la réussite ou l’échec de la fonction. Les codes de retour possibles incluent, sans s’y limiter, les éléments suivants.

Code de retour Description
ERROR_SUCCESS
La fonction a réussi.
NTE_BAD_DATA
Le contenu n’a pas pu être décodé.
NTE_INVALID_HANDLE
Le handle de flux pointé vers le paramètre hStream n’est pas valide.
NTE_NO_MEMORY
La mémoire disponible était insuffisante pour traiter le contenu.

Remarques

Vous devez appeler NCryptStreamOpenToProtect ou NCryptStreamOpenToUnprotect pour ouvrir un flux avant d’appeler NCryptStreamUpdate

Les messages peuvent être si volumineux qu’il peut être difficile de les traiter en même temps en stockant l’intégralité du message en mémoire. Toutefois, il est possible de traiter des messages volumineux en partitionnant les données à traiter en blocs gérables.

Pour ce faire, utilisez NCryptStreamUpdate dans une boucle qui avance dans le fichier bloc par bloc. Lorsque le message diffusé est traité, les données de sortie résultantes sont transmises à votre application à l’aide d’une fonction de rappel que vous spécifiez. En voici une illustration dans l’exemple suivant. Pour plus d’informations sur la fonction de rappel, consultez PFNCryptStreamOutputCallback.

Note Nous vous déconseillons d’utiliser une taille de bloc trop petite. Les petits blocs nécessitent plus d’appels et donc plus de surcharge d’appel. En outre, les API de streaming sont optimisées pour les blocs plus volumineux. Vous devez tester pour trouver la meilleure taille de bloc pour les données que vous devez traiter.
 
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;
    }

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8 [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2012 [applications de bureau uniquement]
Plateforme cible Windows
En-tête ncryptprotect.h
Bibliothèque NCrypt.lib
DLL NCrypt.dll

Voir aussi

Fonctions DPAPI CNG

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect