VirtualBox

source: vbox/trunk/src/VBox/Installer/win/Stub/VBoxStubCertUtil.cpp@ 46338

Last change on this file since 46338 was 43886, checked in by vboxsync, 12 years ago

BUGZ:6508 Satisfy OSE stuff build process.

File size: 4.9 KB
Line 
1/* $Id: VBoxStubCertUtil.cpp 81975 2012-11-09 13:28:58Z bird $ */
2/** @file
3 * VBoxStub - VirtualBox's Windows installer stub (certificate manipulations).
4 *
5 * NOTE: The content of this file is partly
6 * grabbed from src/VBox/Additions/WINNT/tools/VBoxCertUtil.cpp
7 */
8
9/*
10 * Copyright (C) 2012 Oracle Corporation
11 *
12 * This file is part of VirtualBox Open Source Edition (OSE), as
13 * available from http://www.virtualbox.org. This file is free software;
14 * you can redistribute it and/or modify it under the terms of the GNU
15 * General Public License (GPL) as published by the Free Software
16 * Foundation, in version 2 as it comes in the "COPYING" file of the
17 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19 */
20
21/*******************************************************************************
22* Header Files *
23*******************************************************************************/
24#include <Windows.h>
25#include <Wincrypt.h>
26
27#include <iprt/string.h>
28#include <iprt/message.h>
29#include <iprt/err.h>
30
31
32/**
33 * Reads a certificate from a (const char []) buffer, returning a context
34 * or a the handle to a temporary memory store.
35 *
36 * @returns true on success, false on failure (error message written).
37 * @param kpCertBuf The pointer to the buffer containing the
38 * certificates.
39 * @param cbCertBuf Size of @param kpCertBuf in bytes.
40 * @param ppOutCtx Where to return the handle to the temporary
41 * memory store.
42 */
43static bool readCertBuf(const unsigned char kpCertBuf[], DWORD cbCertBuf, PCCERT_CONTEXT *ppOutCtx)
44{
45 *ppOutCtx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
46 (PBYTE)kpCertBuf, cbCertBuf);
47 if (*ppOutCtx)
48 return true;
49
50 return false;
51}
52
53/**
54 * Opens a certificate store.
55 *
56 * @returns true on success, false on failure (error message written).
57 * @param dwDst The destination, like
58 * CERT_SYSTEM_STORE_LOCAL_MACHINE or
59 * CERT_SYSTEM_STORE_CURRENT_USER.
60 * @param pszStoreNm The store name.
61 */
62static HCERTSTORE openCertStore(DWORD dwDst, const char *pszStoreNm)
63{
64 HCERTSTORE hStore = NULL;
65 PRTUTF16 pwszStoreNm;
66 int rc = RTStrToUtf16(pszStoreNm, &pwszStoreNm);
67 if (RT_SUCCESS(rc))
68 {
69 /*
70 * Make sure CERT_STORE_OPEN_EXISTING_FLAG is not set. This causes Windows XP
71 * to return ACCESS_DENIED when installing TrustedPublisher certificates via
72 * CertAddCertificateContextToStore() if the TrustedPublisher store never has
73 * been used (through certmgr.exe and friends) yet.
74 *
75 * According to MSDN, if neither CERT_STORE_OPEN_EXISTING_FLAG nor
76 * CERT_STORE_CREATE_NEW_FLAG is set, the store will be either opened or
77 * created accordingly.
78 */
79 dwDst &= ~CERT_STORE_OPEN_EXISTING_FLAG;
80
81 hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W,
82 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
83 NULL /* hCryptProv = default */,
84 dwDst,
85 pwszStoreNm);
86
87 RTUtf16Free(pwszStoreNm);
88 }
89 return hStore;
90}
91
92/**
93 * Adds a certificate to a store.
94 *
95 * @returns true on success, false on failure (error message written).
96 * @param dwDst The destination, like
97 * CERT_SYSTEM_STORE_LOCAL_MACHINE or
98 * CERT_SYSTEM_STORE_CURRENT_USER.
99 * @param pszStoreNm The store name.
100 * @param kpCertBuf Buffer that contains a certificate
101 * @param cbCertBuf Size of @param kpCertBuf in bytes
102 */
103bool addCertToStore(DWORD dwDst, const char *pszStoreNm, const unsigned char kpCertBuf[], DWORD cbCertBuf)
104{
105 /*
106 * Get certificate from buffer.
107 */
108 PCCERT_CONTEXT pSrcCtx = NULL;
109 bool fRc = false;
110
111 if (!readCertBuf(kpCertBuf, cbCertBuf, &pSrcCtx))
112 {
113 RTMsgError("Unable to get certificate context: %d", GetLastError());
114 return fRc;
115 }
116
117 /*
118 * Open the certificates store.
119 */
120 HCERTSTORE hDstStore = openCertStore(dwDst, pszStoreNm);
121 if (hDstStore)
122 {
123 /*
124 * Finally, add certificate to store
125 */
126 if (CertAddCertificateContextToStore(hDstStore, pSrcCtx, CERT_STORE_ADD_REPLACE_EXISTING, NULL))
127 fRc = true;
128 else
129 RTMsgError("Unable to install certificate: %d", GetLastError());
130
131 CertCloseStore(hDstStore, CERT_CLOSE_STORE_CHECK_FLAG);
132 }
133 else
134 RTMsgError("Unable to open certificates store: %d", GetLastError());
135
136 /* Release resources */
137 CertFreeCertificateContext(pSrcCtx);
138
139 return fRc;
140}
Note: See TracBrowser for help on using the repository browser.

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