NCryptStreamUpdate 関数 (ncryptprotect.h)

NCryptStreamUpdate 関数は、データブロックの暗号化と暗号化解除を行います。

構文

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

パラメーター

[in] hStream

NCryptStreamOpenToProtect または NCryptStreamOpenToUnprotect呼び出して作成されたストリーム オブジェクトを処理します。

[in] pbData

処理するバイト配列へのポインター。

cbData

pbData パラメーターで指定されたバイナリ配列内のバイト数。

fFinal

データの最後のブロックが処理されたかどうかを示すブール値。

戻り値

関数の成功または失敗を示す状態コードを返します。 可能なリターン コードには、次のものが含まれますが、これらに限定されません。

リターン コード 説明
ERROR_SUCCESS
関数は成功しました。
NTE_BAD_DATA
コンテンツをデコードできませんでした。
NTE_INVALID_HANDLE
hStream パラメーターが指すストリーム ハンドルが無効です。
NTE_NO_MEMORY
コンテンツを処理するために使用できるメモリが不足していました。

注釈

NCryptStreamUpdate を呼び出す前に、NCryptStreamOpenToProtect または NCryptStreamOpenToUnprotect を呼び出してストリームを開く必要があります

メッセージは非常に大きくなる可能性があるため、メッセージ全体をメモリに格納して一度に処理するのは困難な場合があります。 ただし、処理するデータを管理可能なブロックに分割することで、大きなメッセージを処理できます。

これを行うには、ブロックごとにファイル ブロックを進めるループで NCryptStreamUpdate を使用します。 ストリーム メッセージが処理されると、指定したコールバック関数を使用して、結果の出力データがアプリケーションに返されます。 この例を次に示します。 コールバック関数の詳細については、「 PFNCryptStreamOutputCallback」を参照してください。

メモ ブロック サイズが小さすぎないようにすることをお勧めします。 小さいブロックでは、より多くの呼び出しが必要であるため、呼び出しのオーバーヘッドが増えます。 さらに、ストリーミング API は、より大きなブロック用に最適化されています。 処理する必要があるデータに最適なブロック サイズを調べるために実験する必要があります。
 
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;
    }

要件

要件
サポートされている最小のクライアント Windows 8 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2012 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー ncryptprotect.h
Library NCrypt.lib
[DLL] NCrypt.dll

こちらもご覧ください

CNG DPAPI 関数

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect