Delen via


Versleuteling en ontsleuteling

Windows Media Device Manager vereist versleuteling van bestanden die worden verzonden tussen de serviceprovider en de toepassing. U kunt dit op twee manieren doen:

De versleutelingsvereiste voorkomt dat schadelijke toepassingen gegevens verkrijgen die worden doorgegeven tussen softwareonderdelen en beschermt ook de integriteit van gegevens die naar of van het apparaat worden verzonden.

Voor de volgende drie methoden is versleuteling of ontsleuteling vereist.

Methode Beschrijving
IWMDMOperation::TransferObjectData- (Toepassing) Versleuteling of ontsleuteling, afhankelijk van of de toepassing gegevens verzendt of ontvangt.
IMDSPObject::Lees (Serviceprovider) Codering.
IMDSPObject::Schrijf (Serviceprovider) Decodering.

 

Versleuteling en ontsleuteling worden beide uitgevoerd door aanroepen met één methode. Versleuteling wordt uitgevoerd door CSecureChannelClient::EncryptParam- voor toepassingen of door CSecureChannelServer::EncryptParam voor serviceproviders. Ontsleuteling wordt uitgevoerd door CSecureChannelClient::D ecryptParam- voor toepassingen of CSecureChannelServer::D ecryptParam voor serviceproviders. De parameters zijn identiek tussen de client- en servermethoden.

De volgende stappen laten zien hoe u gegevens versleutelt en ontsleutelt. (Deze stappen zijn alleen belangrijk als uw toepassing communiceert met een verouderde serviceprovider die geen IWMDMOperation3 implementeert::TransferObjectDataOnLakeChannel.)

versleutelings

  1. Maak de MAC-sleutel voor de versleutelde gegevens, zoals beschreven in Berichtverificatie.
  2. Roep EncryptParam- aan met de gegevens die moeten worden versleuteld om in-place versleuteling uit te voeren.

In het volgende codevoorbeeld ziet u de implementatie van IMDSPObject::Read. Met deze methode maakt u de MAC-sleutel met behulp van de gegevens voor het versleutelen en de grootte van de gegevens en verzendt u deze beide naar de toepassing.

HRESULT CMyStorage::Read(
    BYTE  *pData,
    DWORD *pdwSize,
    BYTE   abMac[WMDM_MAC_LENGTH])
{
    HRESULT  hr;
    DWORD    dwToRead;         // Bytes to read.
    DWORD    dwRead   = NULL;  // Bytes read.
    BYTE    *pTmpData = NULL;  // Temporary buffer to hold data before 
                               // it is copied to pData.

    // Use a global CSecureChannelServer member to verify that 
    // the client is authenticated.
    if (!(g_pAppSCServer->fIsAuthenticated()))
    {
        return WMDM_E_NOTCERTIFIED;
    }
    

    // Verify that the handle to the file to read is valid.
    if(m_hFile == INVALID_HANDLE_VALUE)
    {
        return E_FAIL;
    }

    // Create a buffer to hold the data read.    
    dwToRead = *pdwSize;
    pTmpData = new BYTE [dwToRead] ;
    if(!pTmpData)
        return E_OUTOFMEMORY;

    // Read data into the temporary buffer.
    if(ReadFile(m_hFile,(LPVOID)pTmpData,dwToRead,&dwRead,NULL)) 
    { 
        *pdwSize = dwRead; 

        if( dwRead )
        {
            // Create a MAC from all the parameters.
            // CORg is a macro that goes to Error label on failure.
            // MAC consists of data and size of data.
            HMAC hMAC;
            
            CORg(g_pAppSCServer->MACInit(&hMAC));
            CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pTmpData), dwRead));
            CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(DWORD)));
            CORg(g_pAppSCServer->MACFinal(hMAC, abMac));
            
            // Encrypt the data.
            CORg(g_pAppSCServer->EncryptParam(pTmpData, dwRead));
            
            // Copy data from the temporary buffer into the out parameter.
            memcpy(pData, pTmpData, dwRead);
        }
    
        hr = S_OK; 
    }
    else
    { 
        *pdwSize = 0; 

        hr = E_FAIL; 
    }

Error:

    if(pTmpData) 
    {
        delete [] pTmpData;
    }

    return hr;
} 

ontsleuteling

  1. Roep DecryptParam aan met de gegevens die moeten worden versleuteld om in-place ontsleuteling uit te voeren.
  2. Controleer de MAC-sleutel voor de ontsleutelde gegevens, zoals beschreven in Berichtverificatie.

In het volgende codevoorbeeld ziet u de implementatie van IMDSPObject::Write. Met deze methode maakt u de MAC-sleutel met behulp van de gegevens voor het versleutelen en de grootte van de gegevens en verzendt u deze beide naar de toepassing.

HRESULT CMyStorage::Write(BYTE *pData, DWORD *pdwSize,
                                 BYTE abMac[WMDM_MAC_LENGTH])
{
    HRESULT  hr;
    DWORD    dwWritten = 0;
    BYTE    *pTmpData  = NULL;          // Temporary buffer to hold the 
                                        // data during decryption.
    BYTE     pTempMac[WMDM_MAC_LENGTH]; // Temporary MAC that will be 
                                        // copied into the abMac
                                        // out parameter.

    if( m_hFile == INVALID_HANDLE_VALUE )
    {
        return E_FAIL;
    }

    // Allocate the temporary buffer and copy the encrypted data into it.
    pTmpData = new BYTE [*pdwSize];
    if(!pTmpData)
        return E_OUTOFMEMORY;
    memcpy(pTmpData, pData, *pdwSize);

    // Decrypt the data.
    CHRg(g_pAppSCServer->DecryptParam(pTmpData, *pdwSize));

    // Check the MAC passed to the method. The MAC is built from
    // the data and data size parameters.
    // CORg is a macro that goes to the Error label on failure.
    HMAC hMAC;
    CORg(g_pAppSCServer->MACInit(&hMAC));
    CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pTmpData), *pdwSize));
    CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(*pdwSize)));
    CORg(g_pAppSCServer->MACFinal(hMAC, pTempMac));

    // If the MAC values don't match, return an error.
    if (memcmp(abMac, pTempMac, WMDM_MAC_LENGTH) != 0)
    {
        hr = WMDM_E_MAC_CHECK_FAILED;
        goto Error;
    }

    // The MAC values matched, so write the decrypted data to a local file.
    if( WriteFile(m_hFile,pTmpData,*pdwSize,&dwWritten,NULL) ) 
    {
        hr = S_OK;
    }
    else 
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
    }

    *pdwSize = dwWritten;

Error:

    if( pTmpData )
    {
        delete [] pTmpData;
    }

    return hr;
}

beveiligde geverifieerde kanalen gebruiken