VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTDigest.cpp@ 45227

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

Main: OVF 2.0 support. Part 1 - SHA256 digest is supported.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1/* $Id: tstRTDigest.cpp 45227 2013-03-28 12:22:11Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTSha*, RTMd5, RTCrc*.
4 */
5
6/*
7 * Copyright (C) 2009-2011 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 <iprt/sha.h>
32#include <iprt/md5.h>
33#include <iprt/crc.h>
34
35#include <iprt/ctype.h>
36#include <iprt/err.h>
37#include <iprt/file.h>
38#include <iprt/getopt.h>
39#include <iprt/initterm.h>
40#include <iprt/param.h>
41#include <iprt/path.h>
42#include <iprt/process.h>
43#include <iprt/string.h>
44#include <iprt/stream.h>
45
46
47static int Error(const char *pszFormat, ...)
48{
49 char szName[RTPATH_MAX];
50 if (!RTProcGetExecutablePath(szName, sizeof(szName)))
51 strcpy(szName, "tstRTDigest");
52
53 RTStrmPrintf(g_pStdErr, "%s: error: ", RTPathFilename(szName));
54 va_list va;
55 va_start(va, pszFormat);
56 RTStrmPrintfV(g_pStdErr, pszFormat, va);
57 va_end(va);
58
59 return 1;
60}
61
62
63int main(int argc, char **argv)
64{
65 RTR3InitExe(argc, &argv, 0);
66
67 enum
68 {
69 kDigestType_NotSpecified,
70 kDigestType_CRC32,
71 kDigestType_CRC64,
72 kDigestType_MD5,
73 kDigestType_SHA1,
74 kDigestType_SHA256,
75 kDigestType_SHA512
76 } enmDigestType = kDigestType_NotSpecified;
77
78 enum
79 {
80 kMethod_Full,
81 kMethod_Block,
82 kMethod_File
83 } enmMethod = kMethod_Block;
84
85 static const RTGETOPTDEF s_aOptions[] =
86 {
87 { "--type", 't', RTGETOPT_REQ_STRING },
88 { "--method", 'm', RTGETOPT_REQ_STRING },
89 { "--help", 'h', RTGETOPT_REQ_NOTHING },
90 };
91
92 int ch;
93 RTGETOPTUNION ValueUnion;
94 RTGETOPTSTATE GetState;
95 RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0);
96 while ((ch = RTGetOpt(&GetState, &ValueUnion)))
97 {
98 switch (ch)
99 {
100 case 't':
101 if (!RTStrICmp(ValueUnion.psz, "crc32"))
102 enmDigestType = kDigestType_CRC32;
103 else if (!RTStrICmp(ValueUnion.psz, "crc64"))
104 enmDigestType = kDigestType_CRC64;
105 else if (!RTStrICmp(ValueUnion.psz, "md5"))
106 enmDigestType = kDigestType_MD5;
107 else if (!RTStrICmp(ValueUnion.psz, "sha1"))
108 enmDigestType = kDigestType_SHA1;
109 else if (!RTStrICmp(ValueUnion.psz, "sha256"))
110 enmDigestType = kDigestType_SHA256;
111 else if (!RTStrICmp(ValueUnion.psz, "sha512"))
112 enmDigestType = kDigestType_SHA512;
113 else
114 {
115 Error("Invalid digest type: %s\n", ValueUnion.psz);
116 return 1;
117 }
118 break;
119
120 case 'm':
121 if (!RTStrICmp(ValueUnion.psz, "full"))
122 enmMethod = kMethod_Full;
123 else if (!RTStrICmp(ValueUnion.psz, "block"))
124 enmMethod = kMethod_Block;
125 else if (!RTStrICmp(ValueUnion.psz, "file"))
126 enmMethod = kMethod_File;
127 else
128 {
129 Error("Invalid digest method: %s\n", ValueUnion.psz);
130 return 1;
131 }
132 break;
133
134 case 'h':
135 RTPrintf("syntax: tstRTDigest -t <digest-type> file [file2 [..]]\n");
136 return 1;
137
138 case VINF_GETOPT_NOT_OPTION:
139 {
140 if (enmDigestType == kDigestType_NotSpecified)
141 return Error("No digest type was specified\n");
142
143 switch (enmMethod)
144 {
145 case kMethod_Full:
146 return Error("Full file method is not implemented\n");
147
148 case kMethod_File:
149 switch (enmDigestType)
150 {
151 case kDigestType_SHA1:
152 {
153 char *pszDigest;
154 int rc = RTSha1DigestFromFile(ValueUnion.psz, &pszDigest, NULL, NULL);
155 if (RT_FAILURE(rc))
156 return Error("RTSha1Digest(%s,) -> %Rrc\n", ValueUnion.psz, rc);
157 RTPrintf("%s %s\n", pszDigest, ValueUnion.psz);
158 RTStrFree(pszDigest);
159 break;
160 }
161
162 case kDigestType_SHA256:
163 {
164 char *pszDigest;
165 int rc = RTSha256DigestFromFile(ValueUnion.psz, &pszDigest, NULL, NULL);
166 if (RT_FAILURE(rc))
167 return Error("RTSha256Digest(%s,) -> %Rrc\n", ValueUnion.psz, rc);
168 RTPrintf("%s %s\n", pszDigest, ValueUnion.psz);
169 RTStrFree(pszDigest);
170 break;
171 }
172 default:
173 return Error("The file method isn't implemented for this digest\n");
174 }
175 break;
176
177 case kMethod_Block:
178 {
179 RTFILE hFile;
180 int rc = RTFileOpen(&hFile, ValueUnion.psz, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
181 if (RT_FAILURE(rc))
182 return Error("RTFileOpen(,%s,) -> %Rrc\n", ValueUnion.psz, rc);
183
184 size_t cbRead;
185 uint8_t abBuf[_64K];
186 char *pszDigest = (char *)&abBuf[0];
187 switch (enmDigestType)
188 {
189 case kDigestType_CRC32:
190 {
191 uint32_t uCRC32 = RTCrc32Start();
192 for (;;)
193 {
194 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
195 if (RT_FAILURE(rc) || !cbRead)
196 break;
197 uCRC32 = RTCrc32Process(uCRC32, abBuf, cbRead);
198 }
199 uCRC32 = RTCrc32Finish(uCRC32);
200 RTStrPrintf(pszDigest, sizeof(abBuf), "%08RX32", uCRC32);
201 break;
202 }
203
204 case kDigestType_CRC64:
205 {
206 uint64_t uCRC64 = RTCrc64Start();
207 for (;;)
208 {
209 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
210 if (RT_FAILURE(rc) || !cbRead)
211 break;
212 uCRC64 = RTCrc64Process(uCRC64, abBuf, cbRead);
213 }
214 uCRC64 = RTCrc64Finish(uCRC64);
215 RTStrPrintf(pszDigest, sizeof(abBuf), "%016RX64", uCRC64);
216 break;
217 }
218
219 case kDigestType_MD5:
220 {
221 RTMD5CONTEXT Ctx;
222 RTMd5Init(&Ctx);
223 for (;;)
224 {
225 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
226 if (RT_FAILURE(rc) || !cbRead)
227 break;
228 RTMd5Update(&Ctx, abBuf, cbRead);
229 }
230 uint8_t abDigest[RTMD5HASHSIZE];
231 RTMd5Final(abDigest, &Ctx);
232 RTMd5ToString(abDigest, pszDigest, sizeof(abBuf));
233 break;
234 }
235
236 case kDigestType_SHA1:
237 {
238 RTSHA1CONTEXT Ctx;
239 RTSha1Init(&Ctx);
240 for (;;)
241 {
242 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
243 if (RT_FAILURE(rc) || !cbRead)
244 break;
245 RTSha1Update(&Ctx, abBuf, cbRead);
246 }
247 uint8_t abDigest[RTSHA1_HASH_SIZE];
248 RTSha1Final(&Ctx, abDigest);
249 RTSha1ToString(abDigest, pszDigest, sizeof(abBuf));
250 break;
251 }
252
253 case kDigestType_SHA256:
254 {
255 RTSHA256CONTEXT Ctx;
256 RTSha256Init(&Ctx);
257 for (;;)
258 {
259 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
260 if (RT_FAILURE(rc) || !cbRead)
261 break;
262 RTSha256Update(&Ctx, abBuf, cbRead);
263 }
264 uint8_t abDigest[RTSHA256_HASH_SIZE];
265 RTSha256Final(&Ctx, abDigest);
266 RTSha256ToString(abDigest, pszDigest, sizeof(abBuf));
267 break;
268 }
269
270 case kDigestType_SHA512:
271 {
272 RTSHA512CONTEXT Ctx;
273 RTSha512Init(&Ctx);
274 for (;;)
275 {
276 rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
277 if (RT_FAILURE(rc) || !cbRead)
278 break;
279 RTSha512Update(&Ctx, abBuf, cbRead);
280 }
281 uint8_t abDigest[RTSHA512_HASH_SIZE];
282 RTSha512Final(&Ctx, abDigest);
283 RTSha512ToString(abDigest, pszDigest, sizeof(abBuf));
284 break;
285 }
286
287 default:
288 return Error("Internal error #1\n");
289 }
290 RTFileClose(hFile);
291 if (RT_FAILURE(rc) && rc != VERR_EOF)
292 {
293 RTPrintf("Partial: %s %s\n", pszDigest, ValueUnion.psz);
294 return Error("RTFileRead(%s) -> %Rrc\n", ValueUnion.psz, rc);
295 }
296 RTPrintf("%s %s\n", pszDigest, ValueUnion.psz);
297 break;
298 }
299
300 default:
301 return Error("Internal error #2\n");
302 }
303 break;
304 }
305
306 default:
307 return RTGetOptPrintError(ch, &ValueUnion);
308 }
309 }
310
311 return 0;
312}
313
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