VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstHttp.cpp@ 45398

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

Runtime/http: more error codes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.1 KB
Line 
1/* $Id: tstHttp.cpp 45398 2013-04-08 09:32:00Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Simple cURL testcase.
4 */
5
6/*
7 * Copyright (C) 2012-2013 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* Header Files *
29*******************************************************************************/
30#include <iprt/err.h>
31#include <iprt/http.h>
32#include <iprt/mem.h>
33#include <iprt/file.h>
34#include <iprt/stream.h>
35#include <iprt/string.h>
36#include <iprt/initterm.h>
37
38#define CAFILE_NAME "tstHttp-tempcafile.crt"
39
40int main()
41{
42 unsigned cErrors = 0;
43
44 RTR3InitExeNoArguments(0);
45
46 RTHTTP hHttp;
47 char *pszBuf = NULL;
48 PRTSTREAM CAFile = NULL;
49
50 int rc = RTHttpCreate(&hHttp);
51
52 // create certificate file
53 if (RT_SUCCESS(rc))
54 rc = RTStrmOpen(CAFILE_NAME, "w+b", &CAFile);
55
56 // fetch root CA certificate (new one, often avoided in cert chains by
57 // using an intermediate cert which is signed by old root)
58 if (RT_SUCCESS(rc))
59 rc = RTHttpGet(hHttp,
60 "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem",
61 &pszBuf);
62 if (RT_SUCCESS(rc) && pszBuf)
63 {
64 uint8_t *abSha1;
65 size_t cbSha1;
66 uint8_t *abSha512;
67 size_t cbSha512;
68 size_t cbBuf = strlen(pszBuf);
69 const uint8_t abSha1PCA3G5[] =
70 {
71 0x4e, 0xb6, 0xd5, 0x78, 0x49, 0x9b, 0x1c, 0xcf, 0x5f, 0x58,
72 0x1e, 0xad, 0x56, 0xbe, 0x3d, 0x9b, 0x67, 0x44, 0xa5, 0xe5
73 };
74 const uint8_t abSha512PCA3G5[] =
75 {
76 0xd4, 0xf8, 0x10, 0x54, 0x72, 0x77, 0x0a, 0x2d,
77 0xe3, 0x17, 0xb3, 0xcf, 0xed, 0x61, 0xae, 0x5c,
78 0x5d, 0x3e, 0xde, 0xa1, 0x41, 0x35, 0xb2, 0xdf,
79 0x60, 0xe2, 0x61, 0xfe, 0x3a, 0xc1, 0x66, 0xa3,
80 0x3c, 0x88, 0x54, 0x04, 0x4f, 0x1d, 0x13, 0x46,
81 0xe3, 0x8c, 0x06, 0x92, 0x9d, 0x70, 0x54, 0xc3,
82 0x44, 0xeb, 0x2c, 0x74, 0x25, 0x9e, 0x5d, 0xfb,
83 0xd2, 0x6b, 0xa8, 0x9a, 0xf0, 0xb3, 0x6a, 0x01
84 };
85 rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
86 &abSha1, &cbSha1, &abSha512, &cbSha512);
87 if (RT_SUCCESS(rc))
88 {
89 if (cbSha1 != sizeof(abSha1PCA3G5))
90 {
91 RTPrintf("Wrong SHA1 digest size of PCA-3G5\n");
92 rc = VERR_INTERNAL_ERROR;
93 }
94 else if (memcmp(abSha1PCA3G5, abSha1, cbSha1))
95 {
96 RTPrintf("Wrong SHA1 digest for PCA-3G5:\n"
97 "Got: %.*Rhxs\n"
98 "Expected: %.*Rhxs\n",
99 cbSha1, abSha1, sizeof(abSha1PCA3G5), abSha1PCA3G5);
100 rc = VERR_INTERNAL_ERROR;
101 }
102 if (cbSha512 != sizeof(abSha512PCA3G5))
103 {
104 RTPrintf("Wrong SHA512 digest size of PCA-3G5\n");
105 rc = VERR_INTERNAL_ERROR;
106 }
107 else if (memcmp(abSha512PCA3G5, abSha512, cbSha512))
108 {
109 RTPrintf("Wrong SHA512 digest for PCA-3G5:\n"
110 "Got: %.*Rhxs\n"
111 "Expected: %.*Rhxs\n",
112 cbSha512, abSha512, sizeof(abSha512PCA3G5), abSha512PCA3G5);
113 rc = VERR_INTERNAL_ERROR;
114 }
115 RTMemFree(abSha1);
116 RTMemFree(abSha512);
117 if (RT_SUCCESS(rc))
118 rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
119 if (RT_SUCCESS(rc))
120 rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
121 }
122 }
123 if (pszBuf)
124 {
125 RTMemFree(pszBuf);
126 pszBuf = NULL;
127 }
128
129 // fetch root CA certificate (old one, but still very widely used)
130 if (RT_SUCCESS(rc))
131 rc = RTHttpGet(hHttp,
132 "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem",
133 &pszBuf);
134 if (RT_SUCCESS(rc) && pszBuf)
135 {
136 uint8_t *abSha1;
137 size_t cbSha1;
138 uint8_t *abSha512;
139 size_t cbSha512;
140 size_t cbBuf = strlen(pszBuf);
141 const uint8_t abSha1PCA3[] =
142 {
143 0xa1, 0xdb, 0x63, 0x93, 0x91, 0x6f, 0x17, 0xe4, 0x18, 0x55,
144 0x09, 0x40, 0x04, 0x15, 0xc7, 0x02, 0x40, 0xb0, 0xae, 0x6b
145 };
146 const uint8_t abSha512PCA3[] =
147 {
148 0xbb, 0xf7, 0x8a, 0x19, 0x9f, 0x37, 0xee, 0xa2,
149 0xce, 0xc8, 0xaf, 0xe3, 0xd6, 0x22, 0x54, 0x20,
150 0x74, 0x67, 0x6e, 0xa5, 0x19, 0xb7, 0x62, 0x1e,
151 0xc1, 0x2f, 0xd5, 0x08, 0xf4, 0x64, 0xc4, 0xc6,
152 0xbb, 0xc2, 0xf2, 0x35, 0xe7, 0xbe, 0x32, 0x0b,
153 0xde, 0xb2, 0xfc, 0x44, 0x92, 0x5b, 0x8b, 0x9b,
154 0x77, 0xa5, 0x40, 0x22, 0x18, 0x12, 0xcb, 0x3d,
155 0x0a, 0x67, 0x83, 0x87, 0xc5, 0x45, 0xc4, 0x99
156 };
157 rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
158 &abSha1, &cbSha1, &abSha512, &cbSha512);
159 if (RT_SUCCESS(rc))
160 {
161 if (cbSha1 != sizeof(abSha1PCA3))
162 {
163 RTPrintf("Wrong SHA1 digest size of PCA-3\n");
164 rc = VERR_INTERNAL_ERROR;
165 }
166 else if (memcmp(abSha1PCA3, abSha1, cbSha1))
167 {
168 RTPrintf("Wrong SHA1 digest for PCA-3:\n"
169 "Got: %.*Rhxs\n"
170 "Expected: %.*Rhxs\n",
171 cbSha1, abSha1, sizeof(abSha1PCA3), abSha1PCA3);
172 rc = VERR_INTERNAL_ERROR;
173 }
174 if (cbSha512 != sizeof(abSha512PCA3))
175 {
176 RTPrintf("Wrong SHA512 digest size of PCA-3\n");
177 rc = VERR_INTERNAL_ERROR;
178 }
179 else if (memcmp(abSha512PCA3, abSha512, cbSha512))
180 {
181 RTPrintf("Wrong SHA512 digest for PCA-3:\n"
182 "Got: %.*Rhxs\n"
183 "Expected: %.*Rhxs\n",
184 cbSha512, abSha512, sizeof(abSha512PCA3), abSha512PCA3);
185 rc = VERR_INTERNAL_ERROR;
186 }
187 RTMemFree(abSha1);
188 RTMemFree(abSha512);
189 if (RT_SUCCESS(rc))
190 rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
191 if (RT_SUCCESS(rc))
192 rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
193 }
194 }
195 if (pszBuf)
196 {
197 RTMemFree(pszBuf);
198 pszBuf = NULL;
199 }
200
201 // close certificate file
202 if (CAFile)
203 {
204 RTStrmClose(CAFile);
205 CAFile = NULL;
206 }
207
208 if (RT_SUCCESS(rc))
209 rc = RTHttpSetCAFile(hHttp, CAFILE_NAME);
210
211 if (RT_SUCCESS(rc))
212 rc = RTHttpGet(hHttp,
213 "https://update.virtualbox.org/query.php?platform=LINUX_32BITS_UBUNTU_12_04&version=4.1.18",
214 &pszBuf);
215
216 if ( RT_FAILURE(rc)
217 && rc != VERR_HTTP_COULDNT_CONNECT)
218 cErrors++;
219
220 if (RT_FAILURE(rc))
221 RTPrintf("Error code: %Rrc\n", rc);
222 else
223 RTPrintf("Success!\n");
224 RTPrintf("Got: %s\n", pszBuf);
225 if (pszBuf)
226 {
227 RTMemFree(pszBuf);
228 pszBuf = NULL;
229 }
230
231 RTHttpDestroy(hHttp);
232
233// RTFileDelete(CAFILE_NAME);
234
235 return !!cErrors;
236}
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