VirtualBox

Changeset 42231 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Jul 19, 2012 3:22:59 PM (13 years ago)
Author:
vboxsync
Message:

Main: validation check for decrypt

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r42212 r42231  
    21332133        if (RT_SUCCESS(rc))
    21342134        {
    2135             /* check if this is really a Null-terminated string. */
    21362135            for (unsigned i = 0; i < cbCiphertext; i++)
    21372136            {
     2137                /* sanity check: null-terminated string? */
    21382138                if (abPlaintext[i] == '\0')
    21392139                {
    2140                     *aPlaintext = Utf8Str((const char*)abPlaintext);
    2141                     return VINF_SUCCESS;
     2140                    /* sanity check: valid UTF8 string? */
     2141                    if (RTStrIsValidEncoding((const char*)abPlaintext))
     2142                    {
     2143                        *aPlaintext = Utf8Str((const char*)abPlaintext);
     2144                        return VINF_SUCCESS;
     2145                    }
    21422146                }
    21432147            }
    2144             rc = VERR_INVALID_PARAMETER;
     2148            rc = VERR_INVALID_MAGIC;
    21452149        }
    21462150    }
     
    21682172        return VERR_BUFFER_OVERFLOW;
    21692173
    2170     for (i = 0, j = 0; i < aPlaintextSize && i < aCiphertextSize; i++)
    2171     {
    2172         aCiphertext[i] = (aPlaintext[i] ^ m->SettingsCipherKey[j]);
     2174    if (aCiphertextSize < 32)
     2175        return VERR_INVALID_PARAMETER;
     2176
     2177    AssertCompile(sizeof(m->SettingsCipherKey) >= 32);
     2178
     2179    /* store the first 8 bytes of the cipherkey for verification */
     2180    for (i = 0, j = 0; i < 8; i++, j++)
     2181        aCiphertext[i] = m->SettingsCipherKey[j];
     2182
     2183    for (unsigned k = 0; k < aPlaintextSize && i < aCiphertextSize; i++, k++)
     2184    {
     2185        aCiphertext[i] = (aPlaintext[k] ^ m->SettingsCipherKey[j]);
    21732186        if (++j >= sizeof(m->SettingsCipherKey))
    21742187            j = 0;
     
    22002213                                    const uint8_t *aCiphertext, size_t aCiphertextSize) const
    22012214{
     2215    unsigned i, j;
     2216
    22022217    if (!m->fSettingsCipherKeySet)
    22032218        return VERR_INVALID_STATE;
    22042219
    2205     for (unsigned i = 0, j = 0; i < aCiphertextSize; i++)
    2206     {
    2207         aPlaintext[i] = aCiphertext[i] ^ m->SettingsCipherKey[j];
     2220    if (aCiphertextSize < 32)
     2221        return VERR_INVALID_PARAMETER;
     2222
     2223    /* key verification */
     2224    for (i = 0, j = 0; i < 8; i++, j++)
     2225        if (aCiphertext[i] != m->SettingsCipherKey[j])
     2226            return VERR_INVALID_MAGIC;
     2227
     2228    /* poison */
     2229    memset(aPlaintext, 0xff, aCiphertextSize);
     2230    for (int k = 0; i < aCiphertextSize; i++, k++)
     2231    {
     2232        aPlaintext[k] = aCiphertext[i] ^ m->SettingsCipherKey[j];
    22082233        if (++j >= sizeof(m->SettingsCipherKey))
    22092234            j = 0;
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