VBoxGuestR3LibCredentials.cpp revision 9ffc69ee5b1d727cdebfd2b3daa9161a690b9677
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* $Id$ */
843e19887f64dde75055cf8842fc4db2171eff45johnlev/** @file
843e19887f64dde75055cf8842fc4db2171eff45johnlev * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, user credentials.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright (C) 2009 Oracle Corporation
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * This file is part of VirtualBox Open Source Edition (OSE), as
843e19887f64dde75055cf8842fc4db2171eff45johnlev * available from http://www.virtualbox.org. This file is free software;
843e19887f64dde75055cf8842fc4db2171eff45johnlev * you can redistribute it and/or modify it under the terms of the GNU
843e19887f64dde75055cf8842fc4db2171eff45johnlev * General Public License (GPL) as published by the Free Software
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Foundation, in version 2 as it comes in the "COPYING" file of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file may alternatively be used under the terms
843e19887f64dde75055cf8842fc4db2171eff45johnlev * of the Common Development and Distribution License Version 1.0
843e19887f64dde75055cf8842fc4db2171eff45johnlev * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * VirtualBox OSE distribution, in which case the provisions of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL are applicable instead of those of the GPL.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may elect to license modified versions of this file under the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * terms and conditions of either the GPL or the CDDL or both.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/*******************************************************************************
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab* Header Files *
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab*******************************************************************************/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include <iprt/asm.h>
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include <iprt/mem.h>
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include <iprt/rand.h>
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include <iprt/string.h>
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include <VBox/log.h>
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include "VBGLR3Internal.h"
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/**
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Checks whether user credentials are available to the guest or not.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @returns IPRT status value; VINF_SUCCESS if credentials are available,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * VERR_NOT_FOUND if not. Otherwise an error is occurred.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevVBGLR3DECL(int) VbglR3CredentialsQueryAvailability(void)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev VMMDevCredentials Req;
843e19887f64dde75055cf8842fc4db2171eff45johnlev RT_ZERO(Req);
843e19887f64dde75055cf8842fc4db2171eff45johnlev vmmdevInitRequest((VMMDevRequestHeader*)&Req, VMMDevReq_QueryCredentials);
843e19887f64dde75055cf8842fc4db2171eff45johnlev Req.u32Flags |= VMMDEV_CREDENTIALS_QUERYPRESENCE;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev int rc = vbglR3GRPerform(&Req.header);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (RT_SUCCESS(rc))
843e19887f64dde75055cf8842fc4db2171eff45johnlev {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ((Req.u32Flags & VMMDEV_CREDENTIALS_PRESENT) == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev rc = VERR_NOT_FOUND;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev return rc;
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/**
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Retrieves and clears the user credentials for logging into the guest OS.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @returns IPRT status value
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param ppszUser Receives pointer of allocated user name string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The returned pointer must be freed using VbglR3CredentialsDestroy().
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param ppszPassword Receives pointer of allocated user password string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The returned pointer must be freed using VbglR3CredentialsDestroy().
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param ppszDomain Receives pointer of allocated domain name string.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * The returned pointer must be freed using VbglR3CredentialsDestroy().
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevVBGLR3DECL(int) VbglR3CredentialsRetrieve(char **ppszUser, char **ppszPassword, char **ppszDomain)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev AssertPtrReturn(ppszUser, VERR_INVALID_POINTER);
843e19887f64dde75055cf8842fc4db2171eff45johnlev AssertPtrReturn(ppszPassword, VERR_INVALID_POINTER);
843e19887f64dde75055cf8842fc4db2171eff45johnlev AssertPtrReturn(ppszDomain, VERR_INVALID_POINTER);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev VMMDevCredentials Req;
843e19887f64dde75055cf8842fc4db2171eff45johnlev RT_ZERO(Req);
843e19887f64dde75055cf8842fc4db2171eff45johnlev vmmdevInitRequest((VMMDevRequestHeader*)&Req, VMMDevReq_QueryCredentials);
843e19887f64dde75055cf8842fc4db2171eff45johnlev Req.u32Flags |= VMMDEV_CREDENTIALS_READ | VMMDEV_CREDENTIALS_CLEAR;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab int rc = vbglR3GRPerform(&Req.header);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
5d2eda970e48f8985448151c73e699614ce9f357John Levon {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab rc = RTStrDupEx(ppszUser, Req.szUserName);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
5d2eda970e48f8985448151c73e699614ce9f357John Levon {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab rc = RTStrDupEx(ppszPassword, Req.szPassword);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
843e19887f64dde75055cf8842fc4db2171eff45johnlev {
843e19887f64dde75055cf8842fc4db2171eff45johnlev rc = RTStrDupEx(ppszDomain, Req.szDomain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (RT_SUCCESS(rc))
843e19887f64dde75055cf8842fc4db2171eff45johnlev return VINF_SUCCESS;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
5d2eda970e48f8985448151c73e699614ce9f357John Levon RTStrFree(*ppszPassword);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTStrFree(*ppszUser);
5d2eda970e48f8985448151c73e699614ce9f357John Levon }
5d2eda970e48f8985448151c73e699614ce9f357John Levon }
843e19887f64dde75055cf8842fc4db2171eff45johnlev return rc;
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/**
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Retrieves and clears the user credentials for logging into the guest OS.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * UTF-16 version.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @returns IPRT status value
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param ppwszUser Receives pointer of allocated user name string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The returned pointer must be freed using VbglR3CredentialsDestroyUtf16().
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param ppswzPassword Receives pointer of allocated user password string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The returned pointer must be freed using VbglR3CredentialsDestroyUtf16().
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param ppwszDomain Receives pointer of allocated domain name string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The returned pointer must be freed using VbglR3CredentialsDestroyUtf16().
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab */
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rabVBGLR3DECL(int) VbglR3CredentialsRetrieveUtf16(PRTUTF16 *ppwszUser, PRTUTF16 *ppwszPassword, PRTUTF16 *ppwszDomain)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab{
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab AssertPtrReturn(ppwszUser, VERR_INVALID_POINTER);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab AssertPtrReturn(ppwszPassword, VERR_INVALID_POINTER);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab AssertPtrReturn(ppwszDomain, VERR_INVALID_POINTER);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab char *pszUser, *pszPassword, *pszDomain;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab int rc = VbglR3CredentialsRetrieve(&pszUser, &pszPassword, &pszDomain);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab PRTUTF16 pwszUser = NULL;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab PRTUTF16 pwszPassword = NULL;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab PRTUTF16 pwszDomain = NULL;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab rc = RTStrToUtf16(pszUser, &pwszUser);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab rc = RTStrToUtf16(pszPassword, &pwszPassword);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab rc = RTStrToUtf16(pszDomain, &pwszDomain);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (RT_SUCCESS(rc))
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab *ppwszUser = pwszUser;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab *ppwszPassword = pwszPassword;
843e19887f64dde75055cf8842fc4db2171eff45johnlev *ppwszDomain = pwszDomain;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev else
843e19887f64dde75055cf8842fc4db2171eff45johnlev VbglR3CredentialsDestroyUtf16(pwszUser, pwszPassword, pwszDomain,
843e19887f64dde75055cf8842fc4db2171eff45johnlev 3 /* Passes */);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev VbglR3CredentialsDestroy(pszUser, pszPassword, pszDomain,
843e19887f64dde75055cf8842fc4db2171eff45johnlev 3 /* Passes */);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return rc;
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/**
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Clears and frees the three strings.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab *
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param pszUser Receives pointer of the user name string to destroy.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Optional.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param pszPassword Receives pointer of the password string to destroy.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Optional.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param pszDomain Receives pointer of allocated domain name string.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Optional.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param cPasses Number of wipe passes. The more the better + slower.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab */
843e19887f64dde75055cf8842fc4db2171eff45johnlevVBGLR3DECL(void) VbglR3CredentialsDestroy(char *pszUser, char *pszPassword, char *pszDomain, uint32_t cPasses)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* wipe first */
5d2eda970e48f8985448151c73e699614ce9f357John Levon if (pszUser)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab RTMemWipeThoroughly(pszUser, strlen(pszUser) + 1, cPasses);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (pszPassword)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab RTMemWipeThoroughly(pszPassword, strlen(pszPassword) + 1, cPasses);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (pszDomain)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab RTMemWipeThoroughly(pszDomain, strlen(pszDomain) + 1, cPasses);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab /* then free. */
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab RTStrFree(pszUser);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab RTStrFree(pszPassword);
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTStrFree(pszDomain);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab}
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
843e19887f64dde75055cf8842fc4db2171eff45johnlev/**
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Clears and frees the three strings. UTF-16 version.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab *
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * @param pwszUser Receives pointer of the user name string to destroy.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * Optional.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param pwszPassword Receives pointer of the password string to destroy.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Optional.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param pwszDomain Receives pointer of allocated domain name string.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Optional.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * @param cPasses Number of wipe passes. The more the better + slower.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab */
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rabVBGLR3DECL(void) VbglR3CredentialsDestroyUtf16(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszDomain,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab uint32_t cPasses)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* wipe first */
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (pwszUser)
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTMemWipeThoroughly(pwszUser, RTUtf16Len(pwszUser) + 1, cPasses);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (pwszPassword)
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTMemWipeThoroughly(pwszPassword, RTUtf16Len(pwszPassword) + 1, cPasses);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (pwszDomain)
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTMemWipeThoroughly(pwszDomain, RTUtf16Len(pwszDomain) + 1, cPasses);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* then free. */
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTUtf16Free(pwszUser);
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTUtf16Free(pwszPassword);
843e19887f64dde75055cf8842fc4db2171eff45johnlev RTUtf16Free(pwszDomain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev