VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/crypto/x509-file.cpp@ 74762

Last change on this file since 74762 was 69111, checked in by vboxsync, 7 years ago

(C) year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1/* $Id: x509-file.cpp 69111 2017-10-17 14:26:02Z vboxsync $ */
2/** @file
3 * IPRT - Crypto - X.509, File related APIs.
4 */
5
6/*
7 * Copyright (C) 2006-2017 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/x509.h>
33
34#include <iprt/assert.h>
35#include <iprt/err.h>
36#include <iprt/path.h>
37#include <iprt/crypto/pem.h>
38
39
40/*********************************************************************************************************************************
41* Global Variables *
42*********************************************************************************************************************************/
43static RTCRPEMMARKERWORD const g_aWords_Certificate[] = { { RT_STR_TUPLE("CERTIFICATE") } };
44/** X509 Certificate markers. */
45RT_DECL_DATA_CONST(RTCRPEMMARKER const) g_aRTCrX509CertificateMarkers[] =
46{
47 { g_aWords_Certificate, RT_ELEMENTS(g_aWords_Certificate) }
48};
49/** Number of entries in g_aRTCrX509CertificateMarkers. */
50RT_DECL_DATA_CONST(uint32_t const) g_cRTCrX509CertificateMarkers = RT_ELEMENTS(g_aRTCrX509CertificateMarkers);
51
52
53RTDECL(int) RTCrX509Certificate_ReadFromFile(PRTCRX509CERTIFICATE pCertificate, const char *pszFilename, uint32_t fFlags,
54 PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
55{
56 AssertReturn(!(fFlags & ~RTCRX509CERT_READ_F_PEM_ONLY), VERR_INVALID_FLAGS);
57 PCRTCRPEMSECTION pSectionHead;
58 int rc = RTCrPemReadFile(pszFilename,
59 fFlags & RTCRX509CERT_READ_F_PEM_ONLY ? RTCRPEMREADFILE_F_ONLY_PEM : 0,
60 g_aRTCrX509CertificateMarkers, g_cRTCrX509CertificateMarkers,
61 &pSectionHead, pErrInfo);
62 if (RT_SUCCESS(rc))
63 {
64 if (pSectionHead)
65 {
66 RTCRX509CERTIFICATE TmpCert;
67 RTASN1CURSORPRIMARY PrimaryCursor;
68 RTAsn1CursorInitPrimary(&PrimaryCursor, pSectionHead->pbData, (uint32_t)RT_MIN(pSectionHead->cbData, UINT32_MAX),
69 pErrInfo, pAllocator, RTASN1CURSOR_FLAGS_DER, RTPathFilename(pszFilename));
70 rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &TmpCert, "Cert");
71 if (RT_SUCCESS(rc))
72 {
73 rc = RTCrX509Certificate_CheckSanity(&TmpCert, 0, pErrInfo, "Cert");
74 if (RT_SUCCESS(rc))
75 {
76 rc = RTCrX509Certificate_Clone(pCertificate, &TmpCert, pAllocator);
77 if (RT_SUCCESS(rc))
78 {
79 if (pSectionHead->pNext || PrimaryCursor.Cursor.cbLeft)
80 rc = VINF_ASN1_MORE_DATA;
81 }
82 }
83 RTCrX509Certificate_Delete(&TmpCert);
84 }
85 RTCrPemFreeSections(pSectionHead);
86 }
87 else
88 rc = rc != VINF_SUCCESS ? -rc : VERR_INTERNAL_ERROR_2;
89
90 }
91 return rc;
92}
93
94
95RTDECL(int) RTCrX509Certificate_ReadFromBuffer(PRTCRX509CERTIFICATE pCertificate, const void *pvBuf, size_t cbBuf,
96 uint32_t fFlags, PCRTASN1ALLOCATORVTABLE pAllocator,
97 PRTERRINFO pErrInfo, const char *pszErrorTag)
98{
99 AssertReturn(!(fFlags & ~RTCRX509CERT_READ_F_PEM_ONLY), VERR_INVALID_FLAGS);
100 PCRTCRPEMSECTION pSectionHead;
101 int rc = RTCrPemParseContent(pvBuf, cbBuf,
102 fFlags & RTCRX509CERT_READ_F_PEM_ONLY ? RTCRPEMREADFILE_F_ONLY_PEM : 0,
103 g_aRTCrX509CertificateMarkers, g_cRTCrX509CertificateMarkers,
104 &pSectionHead, pErrInfo);
105 if (RT_SUCCESS(rc))
106 {
107 if (pSectionHead)
108 {
109 RTCRX509CERTIFICATE TmpCert;
110 RTASN1CURSORPRIMARY PrimaryCursor;
111 RTAsn1CursorInitPrimary(&PrimaryCursor, pSectionHead->pbData, (uint32_t)RT_MIN(pSectionHead->cbData, UINT32_MAX),
112 pErrInfo, pAllocator, RTASN1CURSOR_FLAGS_DER, pszErrorTag);
113 rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &TmpCert, "Cert");
114 if (RT_SUCCESS(rc))
115 {
116 rc = RTCrX509Certificate_CheckSanity(&TmpCert, 0, pErrInfo, "Cert");
117 if (RT_SUCCESS(rc))
118 {
119 rc = RTCrX509Certificate_Clone(pCertificate, &TmpCert, pAllocator);
120 if (RT_SUCCESS(rc))
121 {
122 if (pSectionHead->pNext || PrimaryCursor.Cursor.cbLeft)
123 rc = VINF_ASN1_MORE_DATA;
124 }
125 }
126 RTCrX509Certificate_Delete(&TmpCert);
127 }
128 RTCrPemFreeSections(pSectionHead);
129 }
130 else
131 rc = rc != VINF_SUCCESS ? -rc : VERR_INTERNAL_ERROR_2;
132 }
133 return rc;
134}
135
136
137
138#if 0
139RTDECL(int) RTCrX509Certificates_ReadFromFile(const char *pszFilename, uint32_t fFlags,
140 PRTCRX509CERTIFICATES pCertificates, PRTERRINFO pErrInfo)
141{
142 AssertReturn(!(fFlags & ~RTCRX509CERT_READ_F_PEM_ONLY), VERR_INVALID_FLAGS);
143 PCRTCRPEMSECTION pSectionHead;
144 int rc = RTCrPemReadFile(pszFilename,
145 fFlags & RTCRX509CERT_READ_F_PEM_ONLY ? RTCRPEMREADFILE_F_ONLY_PEM : 0,
146 g_aRTCrX509CertificateMarkers, g_cRTCrX509CertificateMarkers,
147 &pSectionHead, pErrInfo);
148 if (RT_SUCCESS(rc))
149 {
150 pCertificates->Allocation
151
152 PCRTCRPEMSECTION pCurSec = pSectionHead;
153 while (pCurSec)
154 {
155
156 pCurSec = pCurSec->pNext;
157 }
158
159 RTCrPemFreeSections(pSectionHead);
160 }
161 return rc;
162}
163#endif
164
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