VirtualBox

source: vbox/trunk/include/iprt/crypto/digest.h@ 55747

Last change on this file since 55747 was 51856, checked in by vboxsync, 10 years ago

Added the odd sha-2 algorithms to RTCrDigest and extended the testcases to cover them. Added VBOX_WITH_ALT_HASH_CODE for avoiding the OpenSSL code even for VBoxRT.dll/so/dylib.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1/** @file
2 * IPRT - Crypto - Cryptographic Hash / Message Digest.
3 */
4
5/*
6 * Copyright (C) 2014 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_crypto_digest_h
27#define ___iprt_crypto_digest_h
28
29#include <iprt/asn1.h>
30
31
32RT_C_DECLS_BEGIN
33
34/** @defgroup grp_rt_crdigest RTCrDigest - Crypographic Hash / Message Digest API.
35 * @ingroup grp_rt
36 * @{
37 */
38
39/**
40 * Cryptographic hash / message digest provider descriptor.
41 *
42 * This gives the basic details and identifiers of the algorithm as well as
43 * function pointers to the implementation.
44 */
45typedef struct RTCRDIGESTDESC
46{
47 /** The message digest provider name. */
48 const char *pszName;
49 /** The object ID string. */
50 const char *pszObjId;
51 /** Pointer to a NULL terminated table of alias object IDs (optional). */
52 const char * const *papszObjIdAliases;
53 /** The IPRT digest type. */
54 RTDIGESTTYPE enmType;
55 /** The max size of the final hash (binary). */
56 uint32_t cbHash;
57 /** The size of the state. */
58 uint32_t cbState;
59 /** Reserved. */
60 uint32_t uReserved;
61
62 /**
63 * Updates the digest with more data.
64 *
65 * @param pvState The opaque message digest state.
66 * @param pvData The data to add to the digest.
67 * @param cbData The amount of data to add to the digest.
68 */
69 DECLCALLBACKMEMBER(void, pfnUpdate)(void *pvState, const void *pvData, size_t cbData);
70
71 /**
72 * Finalizes the digest calculation.
73 *
74 * @param pvState The opaque message digest state.
75 * @param pbHash Where to store the output digest. This buffer is at
76 * least RTCRDIGESTDESC::cbHash bytes large.
77 */
78 DECLCALLBACKMEMBER(void, pfnFinal)(void *pvState, uint8_t *pbHash);
79
80 /**
81 * (Re-)Initializes the digest. Optional.
82 *
83 * Optional, RT_BZERO will be used if NULL.
84 *
85 * @returns IPRT status code.
86 * @param pvState The opaque message digest state.
87 * @param pvOpaque Opaque algortihm specific parameter.
88 * @param fReInit Set if this is a re-init call.
89 */
90 DECLCALLBACKMEMBER(int, pfnInit)(void *pvState, void *pvOpaque, bool fReInit);
91
92 /**
93 * Deletes the message digest state.
94 *
95 * Optional, memset will be used if NULL.
96 *
97 * @param pvState The opaque message digest state.
98 */
99 DECLCALLBACKMEMBER(void, pfnDelete)(void *pvState);
100
101 /**
102 * Clones the message digest state.
103 *
104 * Optional, memcpy will be used if NULL.
105 *
106 * @returns IPRT status code.
107 * @param pvState The opaque message digest state (destination).
108 * @param pvSrcState The opaque message digest state to clone (source).
109 */
110 DECLCALLBACKMEMBER(int, pfnClone)(void *pvState, void const *pvSrcState);
111
112 /**
113 * Gets the hash size.
114 *
115 * Optional, if not provided RTCRDIGESTDESC::cbHash will be returned. If
116 * provided though, RTCRDIGESTDESC::cbHash must be set to the largest possible
117 * hash size.
118 *
119 * @returns The hash size.
120 * @param pvState The opaque message digest state.
121 */
122 DECLCALLBACKMEMBER(uint32_t, pfnGetHashSize)(void *pvState);
123
124 /**
125 * Gets the digest type (when enmType is RTDIGESTTYPE_UNKNOWN).
126 *
127 * @returns The hash size.
128 * @param pvState The opaque message digest state.
129 */
130 DECLCALLBACKMEMBER(RTDIGESTTYPE, pfnGetDigestType)(void *pvState);
131} RTCRDIGESTDESC;
132/** Pointer to const message digest details and vtable. */
133typedef RTCRDIGESTDESC const *PCRTCRDIGESTDESC;
134
135/**
136 * Finds a cryptographic hash / message digest descriptor by object identifier
137 * string.
138 *
139 * @returns Pointer to the message digest details & vtable if found. NULL if
140 * not found.
141 * @param pszObjId The dotted object identifier string of the message
142 * digest algorithm.
143 * @param ppvOpaque Where to return an opaque implementation specfici
144 * sub-type indicator that can be passed to
145 * RTCrDigestCreate. This is optional, fewer
146 * algortihms are available if not specified.
147 */
148RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void *ppvOpaque);
149
150/**
151 * Finds a cryptographic hash / message digest descriptor by object identifier
152 * ASN.1 object.
153 *
154 * @returns Pointer to the message digest details & vtable if found. NULL if
155 * not found.
156 * @param pszObjId The ASN.1 object ID of the message digest algorithm.
157 * @param ppvOpaque Where to return an opaque implementation specfici
158 * sub-type indicator that can be passed to
159 * RTCrDigestCreate. This is optional, fewer
160 * algortihms are available if not specified.
161 */
162RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
163
164RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByType(RTDIGESTTYPE enmDigestType);
165RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId);
166RTDECL(int) RTCrDigestCreateByObjId(PRTCRDIGEST phDigest, PCRTASN1OBJID pObjId);
167RTDECL(int) RTCrDigestCreateByType(PRTCRDIGEST phDigest, RTDIGESTTYPE enmDigestType);
168
169
170RTDECL(int) RTCrDigestCreate(PRTCRDIGEST phDigest, PCRTCRDIGESTDESC pDesc, void *pvOpaque);
171RTDECL(int) RTCrDigestClone(PRTCRDIGEST phDigest, RTCRDIGEST hSrc);
172RTDECL(int) RTCrDigestReset(RTCRDIGEST hDigest);
173RTDECL(uint32_t) RTCrDigestRetain(RTCRDIGEST hDigest);
174RTDECL(uint32_t) RTCrDigestRelease(RTCRDIGEST hDigest);
175RTDECL(int) RTCrDigestUpdate(RTCRDIGEST hDigest, void const *pvData, size_t cbData);
176RTDECL(int) RTCrDigestFinal(RTCRDIGEST hDigest, void *pvHash, size_t cbHash);
177RTDECL(bool) RTCrDigestMatch(RTCRDIGEST hDigest, void const *pvHash, size_t cbHash);
178RTDECL(uint8_t const *) RTCrDigestGetHash(RTCRDIGEST hDigest);
179RTDECL(uint32_t) RTCrDigestGetHashSize(RTCRDIGEST hDigest);
180RTDECL(uint64_t) RTCrDigestGetConsumedSize(RTCRDIGEST hDigest);
181RTDECL(bool) RTCrDigestIsFinalized(RTCRDIGEST hDigest);
182RTDECL(RTDIGESTTYPE) RTCrDigestGetType(RTCRDIGEST hDigest);
183
184/** @} */
185
186RT_C_DECLS_END
187
188#endif
189
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