VirtualBox

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

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

Runtime/http: added error code + don't make tstHttp fail if we can't connect

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