创建内容密钥示例
[与此页面关联的功能(Windows Media Format 11 SDK)是一项旧功能。 它已被 源读取器 和 接收器编写器取代。 源读取器 和 接收器编写器 已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 源读取器 和 接收器编写器,而不是 Windows 媒体格式 11 SDK。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
内容密钥用于加密 Windows 媒体 DRM 导入的媒体示例。 下面的代码示例演示如何创建和初始化内容密钥结构。
HRESULT CreateContentKey( WMDRM_IMPORT_CONTENT_KEY **ppContentKey, DWORD *pcbContentKey)
{
// TODO: Set this value to the desired number of bytes for the content key data.
const DWORD IV_DATA_SIZE = 16;
HRESULT hr = S_OK;
WMDRM_IMPORT_CONTENT_KEY *pContentKey = NULL;
// The content key.
const BYTE rgbContentKey[] = {
0x67, 0x39, 0x83, 0xb9,
0x52, 0xa8, 0xe3
};
const DWORD CONTENT_KEY_DATA_SIZE = sizeof(rgbContentKey);
// Compute the total size of the content key structure
DWORD cbContentKey = sizeof( WMDRM_IMPORT_CONTENT_KEY ) +
IV_DATA_SIZE + CONTENT_KEY_DATA_SIZE;
// Make sure we have a valid
if( NULL == ppContentKey )
{
hr = E_POINTER;
goto EXIT;
}
// Allocate the content key, locally first
pContentKey = (WMDRM_IMPORT_CONTENT_KEY *)new BYTE[ cbContentKey ];
// Check the allocation was successful
if( NULL == pContentKey )
{
hr = E_OUTOFMEMORY;
goto EXIT;
}
// Ininitalize the key
ZeroMemory( pContentKey, cbContentKey );
pContentKey->dwVersion = 0;
pContentKey->cbStructSize = cbContentKey;
// Set the initialization vector key type
pContentKey->dwIVKeyType = WMDRM_KEYTYPE_RC4;
pContentKey->cbIVKey = IV_DATA_SIZE;
// Generate a random initialization vector. Note that this random number
// generator is not very good. It is only intended to be demonstrative
// and it is not recommended for use in commercial strength code.
srand((unsigned int)time(NULL));
BYTE* pKeyData = pContentKey->rgbKeyData;
for (size_t i = 0; i < IV_DATA_SIZE; ++i)
{
*pKeyData++ = (BYTE)(rand() & 0xFF);
}
// Set the content key type.
pContentKey->dwContentKeyType = WMDRM_KEYTYPE_COCKTAIL;
pContentKey->cbContentKey = CONTENT_KEY_DATA_SIZE;
// Fill out the content key.
for (size_t i = 0; i < CONTENT_KEY_DATA_SIZE; ++i)
{
*pKeyData++ = rgbContentKey[i];
}
// If all has been successful, set the parameters
*ppContentKey = pContentKey;
pContentKey = NULL;
*pcbContentKey = cbContentKey;
EXIT:
SAFE_ARRAY_DELETE( pContentKey );
return hr;
}
相关主题