VirtualBox

Changeset 54591 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 2, 2015 7:55:29 PM (10 years ago)
Author:
vboxsync
Message:

Add support to supply passwords for disk encryption while the VM is running

Location:
trunk/src/VBox
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvVD.cpp

    r54340 r54591  
    55
    66/*
    7  * Copyright (C) 2006-2013 Oracle Corporation
     7 * Copyright (C) 2006-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    664664    if (pThis->pIfSecKey)
    665665        rc = pThis->pIfSecKey->pfnKeyRelease(pThis->pIfSecKey, pszId);
     666    else
     667        rc = VERR_NOT_SUPPORTED;
     668
     669    return rc;
     670}
     671
     672static DECLCALLBACK(int) drvvdCryptoKeyStorePasswordRetain(void *pvUser, const char *pszId, const char **ppszPassword)
     673{
     674    PVBOXDISK pThis = (PVBOXDISK)pvUser;
     675    int rc = VINF_SUCCESS;
     676
     677    AssertPtr(pThis->pIfSecKey);
     678    if (pThis->pIfSecKey)
     679        rc = pThis->pIfSecKey->pfnPasswordRetain(pThis->pIfSecKey, pszId, ppszPassword);
     680    else
     681        rc = VERR_NOT_SUPPORTED;
     682
     683    return rc;
     684}
     685
     686static DECLCALLBACK(int) drvvdCryptoKeyStorePasswordRelease(void *pvUser, const char *pszId)
     687{
     688    PVBOXDISK pThis = (PVBOXDISK)pvUser;
     689    int rc = VINF_SUCCESS;
     690
     691    AssertPtr(pThis->pIfSecKey);
     692    if (pThis->pIfSecKey)
     693        rc = pThis->pIfSecKey->pfnPasswordRelease(pThis->pIfSecKey, pszId);
    666694    else
    667695        rc = VERR_NOT_SUPPORTED;
     
    29102938            pThis->VDIfCfg.pfnQueryBytes    = NULL;
    29112939
    2912             pThis->VDIfCrypto.pfnKeyRetain  = drvvdCryptoKeyRetain;
    2913             pThis->VDIfCrypto.pfnKeyRelease = drvvdCryptoKeyRelease;
     2940            pThis->VDIfCrypto.pfnKeyRetain               = drvvdCryptoKeyRetain;
     2941            pThis->VDIfCrypto.pfnKeyRelease              = drvvdCryptoKeyRelease;
     2942            pThis->VDIfCrypto.pfnKeyStorePasswordRetain  = drvvdCryptoKeyStorePasswordRetain;
     2943            pThis->VDIfCrypto.pfnKeyStorePasswordRelease = drvvdCryptoKeyStorePasswordRelease;
    29142944        }
    29152945
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp

    r54525 r54591  
    16791679                break;
    16801680            }
    1681 
     1681        }
     1682        else if (!strcmp(a->argv[1], "addencpassword"))
     1683        {
     1684            if (   a->argc != 4
     1685                && a->argc != 6)
     1686            {
     1687                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     1688                break;
     1689            }
     1690
     1691            if (   strcmp(a->argv[4], "--removeonsuspend")
     1692                || (   strcmp(a->argv[5], "yes")
     1693                    && strcmp(a->argv[5], "no")))
     1694            {
     1695                errorSyntax(USAGE_CONTROLVM, "Invalid parameters");
     1696                break;
     1697            }
     1698
     1699            BOOL fRemoveOnSuspend = FALSE;
     1700            Bstr bstrPwId(a->argv[2]);
     1701            Bstr bstrPw(a->argv[3]);
     1702            if (   a->argc == 6
     1703                && !strcmp(a->argv[5], "yes"))
     1704                fRemoveOnSuspend = TRUE;
     1705
     1706            CHECK_ERROR_BREAK(console, AddDiskEncryptionPassword(bstrPwId.raw(), bstrPw.raw(), fRemoveOnSuspend));
     1707        }
     1708        else if (!strcmp(a->argv[1], "removeencpassword"))
     1709        {
     1710            if (a->argc != 3)
     1711            {
     1712                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     1713                break;
     1714            }
     1715            Bstr bstrPwId(a->argv[2]);
     1716            CHECK_ERROR_BREAK(console, RemoveDiskEncryptionPassword(bstrPwId.raw()));
     1717        }
     1718        else if (!strcmp(a->argv[1], "removeallencpasswords"))
     1719        {
     1720            CHECK_ERROR_BREAK(console, ClearAllDiskEncryptionPasswords());
    16821721        }
    16831722        else
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp

    r54500 r54591  
    16411641static const RTGETOPTDEF g_aEncryptMediumOptions[] =
    16421642{
    1643     { "--newpassword",  'n', RTGETOPT_REQ_STRING },
    1644     { "--oldpassword",  'o', RTGETOPT_REQ_STRING },
    1645     { "--cipher",       'c', RTGETOPT_REQ_STRING }
     1643    { "--newpassword",   'n', RTGETOPT_REQ_STRING },
     1644    { "--oldpassword",   'o', RTGETOPT_REQ_STRING },
     1645    { "--cipher",        'c', RTGETOPT_REQ_STRING },
     1646    { "--newpasswordid", 'i', RTGETOPT_REQ_STRING }
    16461647};
    16471648
     
    16551656    const char *pszCipher = NULL;
    16561657    const char *pszFilenameOrUuid = NULL;
     1658    const char *pszNewPasswordId = NULL;
    16571659
    16581660    int c;
     
    16761678            case 'c':   // --cipher
    16771679                pszCipher = ValueUnion.psz;
     1680                break;
     1681
     1682            case 'i':   // --newpasswordid
     1683                pszNewPasswordId = ValueUnion.psz;
    16781684                break;
    16791685
     
    17081714        return errorSyntax(USAGE_ENCRYPTMEDIUM, "No password specified");
    17091715
     1716    if (   (pszPasswordNew && !pszNewPasswordId)
     1717        || (!pszPasswordNew && pszNewPasswordId))
     1718        return errorSyntax(USAGE_ENCRYPTMEDIUM, "A new password must always have a valid identifier set at the same time");
     1719
    17101720    /* Always open the medium if necessary, there is no other way. */
    17111721    rc = openMedium(a, pszFilenameOrUuid, DeviceType_HardDisk,
     
    17221732    ComPtr<IProgress> progress;
    17231733    CHECK_ERROR(hardDisk, ChangeEncryption(Bstr(pszPasswordNew).raw(), Bstr(pszPasswordOld).raw(),
    1724                                            Bstr(pszCipher).raw(), progress.asOutParam()));
     1734                                           Bstr(pszCipher).raw(), Bstr(pszNewPasswordId).raw(),
     1735                                           progress.asOutParam()));
    17251736    if (SUCCEEDED(rc))
    17261737        rc = showProgress(progress);
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r54487 r54591  
    495495                     "                            cpuexecutioncap <1-100>\n"
    496496                     "                            webcam <attach [path [settings]]> | <detach [path]> | <list>\n"
     497                     "                            addencpassword <id>\n"
     498                     "                                           <password>\n"
     499                     "                                           [--removeonsuspend <yes|no>]\n"
     500                     "                            removeencpassword <id>\n"
     501                     "                            removeallencpasswords\n"
    497502                     "\n", SEP);
    498503    }
     
    637642                     "                            [--oldpassword <old password>]\n"
    638643                     "                            [--cipher <cipher identifier>]\n"
     644                     "                            [--newpasswordid <password identifier>]\n"
    639645                     "\n", SEP);
    640646
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r54584 r54591  
    75307530  <interface
    75317531    name="IConsole" extends="$unknown"
    7532     uuid="e51702d7-4f8f-4ebe-ac47-4b77defffd18"
     7532    uuid="a0059bfc-04e8-4ff0-93d9-2e4d5257d9ee"
    75337533    wsmap="managed"
    75347534    >
     
    83548354    </method>
    83558355
     8356    <method name="addDiskEncryptionPassword">
     8357      <desc>
     8358        Adds a password used for hard disk encryption/decryption.
     8359      </desc>
     8360      <param name="id" type="wstring" dir="in">
     8361        <desc>
     8362          The identifier used for the password. Must match the identifier
     8363          used when the encrypted medium was created.
     8364        </desc>
     8365      </param>
     8366      <param name="password" type="wstring" dir="in">
     8367        <desc>The password.</desc>
     8368      </param>
     8369      <param name="clearOnSuspend" type="boolean" dir="in">
     8370        <desc>
     8371          Flag whether to clear the password on VM suspend (due to a suspending host
     8372          for example). The password must be supplied again before the VM can resume.
     8373        </desc>
     8374      </param>
     8375    </method>
     8376
     8377    <method name="removeDiskEncryptionPassword">
     8378      <desc>
     8379        Removes a password used for hard disk encryption/decryption from
     8380        the running VM. As soon as the medium requiring this password
     8381        is accessed the VM is paused with an error and the password must be
     8382        provided again.
     8383      </desc>
     8384      <param name="id" type="wstring" dir="in">
     8385        <desc>
     8386          The identifier used for the password. Must match the identifier
     8387          used when the encrypted medium was created.
     8388        </desc>
     8389      </param>
     8390    </method>
     8391
     8392    <method name="clearAllDiskEncryptionPasswords">
     8393      <desc>Clears all provided supplied disk encryption passwords.</desc>
     8394    </method>
    83568395  </interface>
    83578396
     
    1342413463  <interface
    1342513464    name="IMedium" extends="$unknown"
    13426     uuid="e6aa3c67-6f51-4ba6-a012-cf4825069abb"
     13465    uuid="edf10636-fd4f-4e24-8d24-f38a41721a00"
    1342713466    wsmap="managed"
    1342813467    >
     
    1470314742      <param name="cipher" type="wstring" dir="in">
    1470414743        <desc>The cipher to use for encryption.</desc>
     14744      </param>
     14745      <param name="newPasswordId" type="wstring" dir="in">
     14746        <desc>The ID of the new password when unlocking the medium.</desc>
    1470514747      </param>
    1470614748      <param name="progress" type="IProgress" dir="return">
  • trunk/src/VBox/Main/include/ConsoleImpl.h

    r54106 r54591  
    55
    66/*
    7  * Copyright (C) 2005-2014 Oracle Corporation
     7 * Copyright (C) 2005-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    351351                     ULONG aMaxDowntime,
    352352                     ComPtr<IProgress> &aProgress);
     353    HRESULT addDiskEncryptionPassword(const com::Utf8Str &aId, const com::Utf8Str &aPassword,
     354                                      BOOL aClearOnSuspend);
     355    HRESULT removeDiskEncryptionPassword(const com::Utf8Str &aId);
     356    HRESULT clearAllDiskEncryptionPasswords();
    353357
    354358    void notifyNatDnsChange(PUVM pUVM, const char *pszDevice, ULONG ulInstanceMax);
     
    585589            SecretKey() { }
    586590
    587             SecretKey(uint8_t *pbKey, size_t cbKey)
     591            SecretKey(uint8_t *pbKey, size_t cbKey, bool fRemoveOnSuspend)
    588592               : m_cRefs(0),
    589593                 m_pbKey(pbKey),
    590                  m_cbKey(cbKey)
     594                 m_cbKey(cbKey),
     595                 m_fRemoveOnSuspend(fRemoveOnSuspend)
    591596            { }
    592597
     
    597602                m_pbKey = NULL;
    598603                m_cbKey = 0;
     604                m_fRemoveOnSuspend = false;
    599605            }
    600606
     
    605611            /** Size of the key in bytes. */
    606612            size_t   m_cbKey;
     613            /** Flag whether to remove the key on suspend. */
     614            bool     m_fRemoveOnSuspend;
    607615    };
    608616
     
    810818                                                        size_t *pcbKey);
    811819    static DECLCALLBACK(int)    i_pdmIfSecKey_KeyRelease(PPDMISECKEY pInterface, const char *pszId);
     820    static DECLCALLBACK(int)    i_pdmIfSecKey_PasswordRetain(PPDMISECKEY pInterface, const char *pszId, const char **ppszPassword);
     821    static DECLCALLBACK(int)    i_pdmIfSecKey_PasswordRelease(PPDMISECKEY pInterface, const char *pszId);
    812822
    813823    static DECLCALLBACK(int)    i_pdmIfSecKeyHlp_KeyMissingNotify(PPDMISECKEYHLP pInterface);
     
    852862     * @{ */
    853863    HRESULT i_consoleParseDiskEncryption(const char *psz, const char **ppszEnd);
    854     HRESULT i_configureEncryptionForDisk(const char *pszUuid);
     864    HRESULT i_configureEncryptionForDisk(const Utf8Str &aId);
    855865    HRESULT i_clearDiskEncryptionKeysOnAllAttachments(void);
    856866    int i_consoleParseKeyValue(const char *psz, const char **ppszEnd,
  • trunk/src/VBox/Main/include/MediumImpl.h

    r54486 r54591  
    77
    88/*
    9  * Copyright (C) 2008-2014 Oracle Corporation
     9 * Copyright (C) 2008-2015 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    276276    HRESULT reset(ComPtr<IProgress> &aProgress);
    277277    HRESULT changeEncryption(const com::Utf8Str &aNewPassword, const com::Utf8Str &aOldPassword,
    278                              const com::Utf8Str &aCipher, ComPtr<IProgress> &aProgress);
     278                             const com::Utf8Str &aCipher, const com::Utf8Str &aNewPasswordId, ComPtr<IProgress> &aProgress);
    279279
    280280    // Private internal nmethods
     
    324324                                                 const uint8_t **ppbKey, size_t *pcbKey);
    325325    static DECLCALLBACK(int) i_vdCryptoKeyRelease(void *pvUser, const char *pszId);
    326     static DECLCALLBACK(int) i_vdCryptoKeyStoreGetPassword(void *pvUser, const char **ppszPassword);
     326    static DECLCALLBACK(int) i_vdCryptoKeyStorePasswordRetain(void *pvUser, const char *pszId, const char **ppszPassword);
     327    static DECLCALLBACK(int) i_vdCryptoKeyStorePasswordRelease(void *pvUser, const char *pszId);
    327328    static DECLCALLBACK(int) i_vdCryptoKeyStoreSave(void *pvUser, const void *pvKeyStore, size_t cbKeyStore);
    328329    static DECLCALLBACK(int) i_vdCryptoKeyStoreReturnParameters(void *pvUser, const char *pszCipher,
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r54230 r54591  
    55
    66/*
    7  * Copyright (C) 2005-2014 Oracle Corporation
     7 * Copyright (C) 2005-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    474474    pIfSecKey->pfnKeyRetain             = Console::i_pdmIfSecKey_KeyRetain;
    475475    pIfSecKey->pfnKeyRelease            = Console::i_pdmIfSecKey_KeyRelease;
     476    pIfSecKey->pfnPasswordRetain        = Console::i_pdmIfSecKey_PasswordRetain;
     477    pIfSecKey->pfnPasswordRelease       = Console::i_pdmIfSecKey_PasswordRelease;
    476478    pIfSecKey->pConsole                 = this;
    477479    mpIfSecKey = pIfSecKey;
     
    33543356
    33553357    i_setMachineStateLocally(machineState);
     3358    return S_OK;
     3359}
     3360
     3361HRESULT Console::addDiskEncryptionPassword(const com::Utf8Str &aId, const com::Utf8Str &aPassword,
     3362                                           BOOL aClearOnSuspend)
     3363{
     3364    if (   aId.isEmpty()
     3365        || aPassword.isEmpty())
     3366        return setError(E_FAIL, tr("The ID and password must be both valid"));
     3367
     3368    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     3369
     3370    /* Check that the ID is not existing already. */
     3371    SecretKeyMap::const_iterator it = m_mapSecretKeys.find(aId);
     3372    if (it != m_mapSecretKeys.end())
     3373        return setError(VBOX_E_OBJECT_IN_USE, tr("A password with the given ID already exists"));
     3374
     3375    HRESULT hrc = S_OK;
     3376    size_t cbKey = aPassword.length() + 1; /* Include terminator */
     3377    uint8_t *pbKey = NULL;
     3378    int rc = RTMemSaferAllocZEx((void **)&pbKey, cbKey, RTMEMSAFER_F_REQUIRE_NOT_PAGABLE);
     3379    if (RT_SUCCESS(rc))
     3380    {
     3381        memcpy(pbKey, aPassword.c_str(), cbKey);
     3382        SecretKey *pKey = new SecretKey(pbKey, cbKey, !!aClearOnSuspend);
     3383        /* Add the key to the map */
     3384        m_mapSecretKeys.insert(std::make_pair(aId, pKey));
     3385        hrc = i_configureEncryptionForDisk(aId);
     3386        if (FAILED(hrc))
     3387            m_mapSecretKeys.erase(aId);
     3388    }
     3389    else
     3390        return setError(E_FAIL, tr("Failed to allocate secure memory for the password (%Rrc)"), rc);
     3391
     3392    return hrc;
     3393}
     3394
     3395HRESULT Console::removeDiskEncryptionPassword(const com::Utf8Str &aId)
     3396{
     3397    if (aId.isEmpty())
     3398        return setError(E_FAIL, tr("The ID must be valid"));
     3399
     3400    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     3401
     3402    SecretKeyMap::const_iterator it = m_mapSecretKeys.find(aId);
     3403    if (it == m_mapSecretKeys.end())
     3404        return setError(VBOX_E_OBJECT_NOT_FOUND, tr("A password with the given ID does not exist"));
     3405
     3406    SecretKey *pKey = it->second;
     3407    if (pKey->m_cRefs)
     3408        return setError(VBOX_E_OBJECT_IN_USE, tr("The password is still in use by the VM"));
     3409
     3410    m_mapSecretKeys.erase(it);
     3411    delete pKey;
     3412
     3413    return S_OK;
     3414}
     3415
     3416HRESULT Console::clearAllDiskEncryptionPasswords()
     3417{
     3418    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     3419
     3420    /* First check whether a password is still in use. */
     3421    for (SecretKeyMap::iterator it = m_mapSecretKeys.begin();
     3422        it != m_mapSecretKeys.end();
     3423        it++)
     3424    {
     3425        SecretKey *pKey = it->second;
     3426        if (pKey->m_cRefs)
     3427            return setError(VBOX_E_OBJECT_IN_USE, tr("The password with ID \"%s\" is still in use by the VM"),
     3428                            it->first.c_str());
     3429    }
     3430
     3431    for (SecretKeyMap::iterator it = m_mapSecretKeys.begin();
     3432        it != m_mapSecretKeys.end();
     3433        it++)
     3434        delete it->second;
     3435    m_mapSecretKeys.clear();
     3436
    33563437    return S_OK;
    33573438}
     
    45494630
    45504631/**
    4551  * Configures the encryption support for the disk identified by the gien UUID with
    4552  * the given key.
     4632 * Configures the encryption support for the disk which have encryption conigured
     4633 * with the configured key.
    45534634 *
    45544635 * @returns COM status code.
    4555  * @param   pszUuid   The UUID of the disk to configure encryption for.
     4636 * @param   aId    The ID of the password.
    45564637 */
    4557 HRESULT Console::i_configureEncryptionForDisk(const char *pszUuid)
     4638HRESULT Console::i_configureEncryptionForDisk(const com::Utf8Str &strId)
    45584639{
    45594640    HRESULT hrc = S_OK;
     
    45804661        ComPtr<IMedium> pMedium;
    45814662        ComPtr<IMedium> pBase;
    4582         Bstr uuid;
     4663        Bstr bstrKeyId;
    45834664
    45844665        hrc = pAtt->COMGETTER(Medium)(pMedium.asOutParam());
     
    45954676            break;
    45964677
    4597         hrc = pBase->COMGETTER(Id)(uuid.asOutParam());
    4598         if (FAILED(hrc))
     4678        hrc = pBase->GetProperty(Bstr("CRYPT/KeyId").raw(), bstrKeyId.asOutParam());
     4679        if (hrc == VBOX_E_OBJECT_NOT_FOUND)
     4680            continue;
     4681        else if (FAILED(hrc))
    45994682            break;
    46004683
    4601         if (!RTUuidCompare2Strs(Utf8Str(uuid).c_str(), pszUuid))
     4684        if (strId.equals(Utf8Str(bstrKeyId)))
    46024685        {
    46034686            /*
     
    47374820                if (RT_SUCCESS(rc))
    47384821                {
    4739                     SecretKey *pKey = new SecretKey(pbKey, cbKey);
     4822                    SecretKey *pKey = new SecretKey(pbKey, cbKey, true /* fRemoveOnSuspend */);
    47404823                    /* Add the key to the map */
    47414824                    m_mapSecretKeys.insert(std::make_pair(Utf8Str(pszUuid), pKey));
    4742                     hrc = i_configureEncryptionForDisk(pszUuid);
     4825                    hrc = i_configureEncryptionForDisk(Utf8Str(pszUuid));
    47434826                    if (FAILED(hrc))
    47444827                    {
     
    1032810411    Console *pConsole = ((MYPDMISECKEY *)pInterface)->pConsole;
    1032910412
     10413    AutoReadLock thatLock(pConsole COMMA_LOCKVAL_SRC_POS);
    1033010414    SecretKeyMap::const_iterator it = pConsole->m_mapSecretKeys.find(Utf8Str(pszId));
    1033110415    if (it != pConsole->m_mapSecretKeys.end())
     
    1034910433{
    1035010434    Console *pConsole = ((MYPDMISECKEY *)pInterface)->pConsole;
     10435
     10436    AutoReadLock thatLock(pConsole COMMA_LOCKVAL_SRC_POS);
     10437    SecretKeyMap::const_iterator it = pConsole->m_mapSecretKeys.find(Utf8Str(pszId));
     10438    if (it != pConsole->m_mapSecretKeys.end())
     10439    {
     10440        SecretKey *pKey = (*it).second;
     10441        ASMAtomicDecU32(&pKey->m_cRefs);
     10442        return VINF_SUCCESS;
     10443    }
     10444
     10445    return VERR_NOT_FOUND;
     10446}
     10447
     10448/**
     10449 * @interface_method_impl{PDMISECKEY,pfnPasswordRetain}
     10450 */
     10451/*static*/ DECLCALLBACK(int)
     10452Console::i_pdmIfSecKey_PasswordRetain(PPDMISECKEY pInterface, const char *pszId, const char **ppszPassword)
     10453{
     10454    Console *pConsole = ((MYPDMISECKEY *)pInterface)->pConsole;
     10455
     10456    AutoReadLock thatLock(pConsole COMMA_LOCKVAL_SRC_POS);
     10457    SecretKeyMap::const_iterator it = pConsole->m_mapSecretKeys.find(Utf8Str(pszId));
     10458    if (it != pConsole->m_mapSecretKeys.end())
     10459    {
     10460        SecretKey *pKey = (*it).second;
     10461
     10462        ASMAtomicIncU32(&pKey->m_cRefs);
     10463        *ppszPassword = (const char *)pKey->m_pbKey;
     10464        return VINF_SUCCESS;
     10465    }
     10466
     10467    return VERR_NOT_FOUND;
     10468}
     10469
     10470/**
     10471 * @interface_method_impl{PDMISECKEY,pfnPasswordRelease}
     10472 */
     10473/*static*/ DECLCALLBACK(int)
     10474Console::i_pdmIfSecKey_PasswordRelease(PPDMISECKEY pInterface, const char *pszId)
     10475{
     10476    Console *pConsole = ((MYPDMISECKEY *)pInterface)->pConsole;
     10477
     10478    AutoReadLock thatLock(pConsole COMMA_LOCKVAL_SRC_POS);
    1035110479    SecretKeyMap::const_iterator it = pConsole->m_mapSecretKeys.find(Utf8Str(pszId));
    1035210480    if (it != pConsole->m_mapSecretKeys.end())
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r54486 r54591  
    678678                const com::Utf8Str &strOldPassword,
    679679                const com::Utf8Str &strCipher,
     680                const com::Utf8Str &strNewPasswordId,
    680681                Progress *aProgress,
    681682                MediumLockList *aMediumLockList)
     
    684685          mstrOldPassword(strOldPassword),
    685686          mstrCipher(strCipher),
     687          mstrNewPasswordId(strNewPasswordId),
    686688          mpMediumLockList(aMediumLockList)
    687689    {
     
    707709    Utf8Str mstrOldPassword;
    708710    Utf8Str mstrCipher;
     711    Utf8Str mstrNewPasswordId;
    709712    MediumLockList *mpMediumLockList;
    710713    PVDINTERFACE    mVDImageIfaces;
     
    30273030
    30283031HRESULT Medium::changeEncryption(const com::Utf8Str &aNewPassword, const com::Utf8Str &aOldPassword,
    3029                                  const com::Utf8Str &aCipher, ComPtr<IProgress> &aProgress)
     3032                                 const com::Utf8Str &aCipher, const com::Utf8Str &aNewPasswordId,
     3033                                 ComPtr<IProgress> &aProgress)
    30303034{
    30313035    HRESULT rc = S_OK;
     
    31003104        /* setup task object to carry out the operation asynchronously */
    31013105        pTask = new Medium::EncryptTask(this, aNewPassword, aOldPassword,
    3102                                         aCipher, pProgress, pMediumLockList);
     3106                                        aCipher, aNewPasswordId, pProgress, pMediumLockList);
    31033107        rc = pTask->rc();
    31043108        AssertComRC(rc);
     
    68026806    if (!strcmp(pszName, "Algorithm"))
    68036807        cbValue = strlen(pSettings->pszCipher) + 1;
     6808    else if (!strcmp(pszName, "KeyId"))
     6809        cbValue = sizeof("irrelevant");
    68046810    else if (!strcmp(pszName, "KeyStore"))
    6805         cbValue = RTBase64DecodedSize(pSettings->pszKeyStoreLoad, NULL) + 1;
     6811    {
     6812        if (!pSettings->pszKeyStoreLoad)
     6813            return VERR_CFGM_VALUE_NOT_FOUND;
     6814        cbValue = strlen(pSettings->pszKeyStoreLoad) + 1;
     6815    }
    68066816    else if (!strcmp(pszName, "CreateKeyStore"))
    68076817        cbValue = 2; /* Single digit + terminator. */
     
    68216831    AssertReturn(VALID_PTR(pszValue), VERR_INVALID_POINTER);
    68226832
    6823     if (!strcmp(pszName, "KeyStore"))
    6824         return RTBase64Decode(pSettings->pszKeyStoreLoad, pszValue, cchValue, NULL, NULL);
     6833    const char *psz = NULL;
     6834    if (!strcmp(pszName, "Algorithm"))
     6835        psz = pSettings->pszCipher;
     6836    else if (!strcmp(pszName, "KeyId"))
     6837        psz = "irrelevant";
     6838    else if (!strcmp(pszName, "KeyStore"))
     6839        psz = pSettings->pszKeyStoreLoad;
     6840    else if (!strcmp(pszName, "CreateKeyStore"))
     6841    {
     6842        if (pSettings->fCreateKeyStore)
     6843            psz = "1";
     6844        else
     6845            psz = "0";
     6846    }
    68256847    else
    6826     {
    6827         const char *psz = NULL;
    6828         if (!strcmp(pszName, "Algorithm"))
    6829             psz = pSettings->pszCipher;
    6830         else if (!strcmp(pszName, "CreateKeyStore"))
    6831         {
    6832             if (pSettings->fCreateKeyStore)
    6833                 psz = "1";
    6834             else
    6835                 psz = "0";
    6836         }
    6837         else
    6838             return VERR_CFGM_VALUE_NOT_FOUND;
    6839 
    6840         size_t cch = strlen(psz);
    6841         if (cch >= cchValue)
    6842             return VERR_CFGM_NOT_ENOUGH_SPACE;
    6843 
    6844         memcpy(pszValue, psz, cch + 1);
    6845     }
    6846 
     6848        return VERR_CFGM_VALUE_NOT_FOUND;
     6849
     6850    size_t cch = strlen(psz);
     6851    if (cch >= cchValue)
     6852        return VERR_CFGM_NOT_ENOUGH_SPACE;
     6853
     6854    memcpy(pszValue, psz, cch + 1);
    68476855    return VINF_SUCCESS;
    68486856}
     
    68636871}
    68646872
    6865 DECLCALLBACK(int) Medium::i_vdCryptoKeyStoreGetPassword(void *pvUser, const char **ppszPassword)
     6873DECLCALLBACK(int) Medium::i_vdCryptoKeyStorePasswordRetain(void *pvUser, const char *pszId, const char **ppszPassword)
    68666874{
    68676875    Medium::CryptoFilterSettings *pSettings = (Medium::CryptoFilterSettings *)pvUser;
     
    68726880}
    68736881
    6874 DECLCALLBACK(int) Medium::i_vdCryptoKeyStoreSave(void *pvUser, const void *pvKeyStore, size_t cbKeyStore)
     6882DECLCALLBACK(int) Medium::i_vdCryptoKeyStorePasswordRelease(void *pvUser, const char *pszId)
    68756883{
    68766884    Medium::CryptoFilterSettings *pSettings = (Medium::CryptoFilterSettings *)pvUser;
    68776885    AssertPtrReturn(pSettings, VERR_GENERAL_FAILURE);
    6878 
    6879     size_t cbEnc = RTBase64EncodedLength(cbKeyStore);
    6880     pSettings->pszKeyStore = (char *)RTMemAllocZ(cbEnc + 1);
     6886    return VINF_SUCCESS;
     6887}
     6888
     6889DECLCALLBACK(int) Medium::i_vdCryptoKeyStoreSave(void *pvUser, const void *pvKeyStore, size_t cbKeyStore)
     6890{
     6891    Medium::CryptoFilterSettings *pSettings = (Medium::CryptoFilterSettings *)pvUser;
     6892    AssertPtrReturn(pSettings, VERR_GENERAL_FAILURE);
     6893
     6894    pSettings->pszKeyStore = (char *)RTMemAllocZ(cbKeyStore);
    68816895    if (!pSettings->pszKeyStore)
    68826896        return VERR_NO_MEMORY;
    68836897
    6884     int rc = RTBase64Encode(pvKeyStore, cbKeyStore, pSettings->pszKeyStore, cbEnc + 1, NULL);
    6885     if (RT_FAILURE(rc))
    6886     {
    6887         RTMemFree(pSettings->pszKeyStore);
    6888         pSettings->pszKeyStore = NULL;
    6889     }
    6890 
    6891     return rc;
     6898    memcpy(pSettings->pszKeyStore, pvKeyStore, cbKeyStore);
     6899    return VINF_SUCCESS;
    68926900}
    68936901
     
    87278735    pSettings->vdIfCrypto.pfnKeyRetain                = i_vdCryptoKeyRetain;
    87288736    pSettings->vdIfCrypto.pfnKeyRelease               = i_vdCryptoKeyRelease;
    8729     pSettings->vdIfCrypto.pfnKeyStoreGetPassword      = i_vdCryptoKeyStoreGetPassword;
     8737    pSettings->vdIfCrypto.pfnKeyStorePasswordRetain   = i_vdCryptoKeyStorePasswordRetain;
     8738    pSettings->vdIfCrypto.pfnKeyStorePasswordRelease  = i_vdCryptoKeyStorePasswordRelease;
    87308739    pSettings->vdIfCrypto.pfnKeyStoreSave             = i_vdCryptoKeyStoreSave;
    87318740    pSettings->vdIfCrypto.pfnKeyStoreReturnParameters = i_vdCryptoKeyStoreReturnParameters;
     
    87458754
    87468755/**
    8747  * Implementation code for the "compact" task.
     8756 * Implementation code for the "encrypt" task.
    87488757 *
    87498758 * @param task
     
    88368845                                   tr("No valid cipher identifier was given for encryption"));
    88378846
     8847                if (task.mstrNewPasswordId.isEmpty())
     8848                    throw setError(VBOX_E_INVALID_OBJECT_STATE,
     8849                                   tr("A new password must always have a valid identifier"));
     8850
    88388851                i_taskEncryptSettingsSetup(&CryptoSettingsWrite, task.mstrCipher.c_str(), NULL,
    88398852                                           task.mstrNewPassword.c_str(), true /* fCreateKeyStore */);
     
    88448857                                   i_vdError(vrc).c_str());
    88458858            }
     8859            else if (task.mstrNewPasswordId.isNotEmpty())
     8860                throw setError(VBOX_E_INVALID_OBJECT_STATE,
     8861                               tr("The password identifier must be empty if there is no new password set for encryption"));
    88468862
    88478863            /* Open all media in the chain. */
     
    89318947                m->mapProperties.erase(it);
    89328948
     8949            it = m->mapProperties.find("CRYPT/KeyId");
     8950            if (it != m->mapProperties.end())
     8951                m->mapProperties.erase(it);
     8952
    89338953            if (CryptoSettingsWrite.pszKeyStore)
     8954            {
    89348955                m->mapProperties["CRYPT/KeyStore"] = Utf8Str(CryptoSettingsWrite.pszKeyStore);
     8956                m->mapProperties["CRYPT/KeyId"] = task.mstrNewPasswordId;
     8957            }
    89358958
    89368959            thisLock.release();
  • trunk/src/VBox/Storage/VD.cpp

    r54430 r54591  
    55
    66/*
    7  * Copyright (C) 2006-2014 Oracle Corporation
     7 * Copyright (C) 2006-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    88278827        AssertMsg(pDisk->u32Signature == VBOXHDDDISK_SIGNATURE, ("u32Signature=%08x\n", pDisk->u32Signature));
    88288828
    8829         AssertMsgBreakStmt(!(fFlags & VD_FILTER_FLAGS_MASK),
     8829        AssertMsgBreakStmt(!(fFlags & ~VD_FILTER_FLAGS_MASK),
    88308830                           ("Invalid flags set (fFlags=%#x)\n", fFlags),
    88318831                           rc = VERR_INVALID_PARAMETER);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette