VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/crypto/RTCrStoreCertExportAsPem.cpp@ 62477

Last change on this file since 62477 was 62477, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.1 KB
Line 
1/* $Id: RTCrStoreCertExportAsPem.cpp 62477 2016-07-22 18:27:37Z vboxsync $ */
2/** @file
3 * IPRT - Cryptographic (Certificate) Store, RTCrStoreCertExportAsPem.
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include "internal/iprt.h"
32#include <iprt/crypto/store.h>
33
34#include <iprt/assert.h>
35#include <iprt/base64.h>
36#include <iprt/dir.h>
37#include <iprt/err.h>
38#include <iprt/mem.h>
39#include <iprt/stream.h>
40
41
42
43RTDECL(int) RTCrStoreCertExportAsPem(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename)
44{
45 /*
46 * Validate input.
47 */
48 AssertReturn(!fFlags, VERR_INVALID_FLAGS);
49
50 /*
51 * Start the enumeration first as this validates the store handle.
52 */
53 RTCRSTORECERTSEARCH Search;
54 int rc = RTCrStoreCertFindAll(hStore, &Search);
55 if (RT_SUCCESS(rc))
56 {
57 /*
58 * Open the file for writing.
59 *
60 * Note! We must use text and no binary here, because the base-64 API
61 * below will use host specific EOL markers, not CRLF as PEM
62 * specifies.
63 */
64 PRTSTREAM hStrm;
65 rc = RTStrmOpen(pszFilename, "w", &hStrm);
66 if (RT_SUCCESS(rc))
67 {
68 /*
69 * Enumerate the certificates in the store, writing them out one by one.
70 */
71 size_t cbBase64 = 0;
72 char *pszBase64 = NULL;
73 PCRTCRCERTCTX pCertCtx;
74 while ((pCertCtx = RTCrStoreCertSearchNext(hStore, &Search)) != NULL)
75 {
76 const char *pszMarker;
77 switch (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_MASK)
78 {
79 case RTCRCERTCTX_F_ENC_X509_DER: pszMarker = "CERTIFICATE"; break;
80 case RTCRCERTCTX_F_ENC_TAF_DER: pszMarker = "TRUST ANCHOR"; break;
81 default: pszMarker = NULL; break;
82 }
83 if (pszMarker && pCertCtx->cbEncoded > 0)
84 {
85 /*
86 * Do the base64 conversion first.
87 */
88 size_t cchEncoded = RTBase64EncodedLength(pCertCtx->cbEncoded);
89 if (cchEncoded < cbBase64)
90 { /* likely */ }
91 else
92 {
93 size_t cbNew = RT_ALIGN(cchEncoded + 64, 128);
94 void *pvNew = RTMemRealloc(pszBase64, cbNew);
95 if (!pvNew)
96 {
97 rc = VERR_NO_MEMORY;
98 break;
99 }
100 cbBase64 = cbNew;
101 pszBase64 = (char *)pvNew;
102 }
103 rc = RTBase64Encode(pCertCtx->pabEncoded, pCertCtx->cbEncoded, pszBase64, cbBase64, &cchEncoded);
104 if (RT_FAILURE(rc))
105 break;
106
107 RTStrmPrintf(hStrm, "-----BEGIN %s-----\n", pszMarker);
108 RTStrmWrite(hStrm, pszBase64, cchEncoded);
109 rc = RTStrmPrintf(hStrm, "\n-----END %s-----\n", pszMarker);
110 if (RT_FAILURE(rc))
111 break;
112 }
113
114 RTCrCertCtxRelease(pCertCtx);
115 }
116 if (pCertCtx)
117 RTCrCertCtxRelease(pCertCtx);
118 RTMemFree(pszBase64);
119
120 /*
121 * Flush the output file before closing.
122 */
123 int rc2 = RTStrmFlush(hStrm);
124 if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
125 rc = rc2;
126 RTStrmClearError(hStrm); /** @todo fix RTStrmClose... */
127 rc2 = RTStrmClose(hStrm);
128 if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
129 rc = rc2;
130 }
131
132 int rc2 = RTCrStoreCertSearchDestroy(hStore, &Search); AssertRC(rc2);
133 }
134 return rc;
135}
136RT_EXPORT_SYMBOL(RTCrStoreCertExportAsPem);
137
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