]> git.proxmox.com Git - mirror_edk2.git/blob - CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5.c
CryptoPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / Hash / CryptMd5.c
1 /** @file
2 MD5 Digest Wrapper Implementation over OpenSSL.
3
4 Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include "InternalCryptLib.h"
10 #include <openssl/md5.h>
11
12
13 /**
14 Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.
15
16 @return The size, in bytes, of the context buffer required for MD5 hash operations.
17
18 **/
19 UINTN
20 EFIAPI
21 Md5GetContextSize (
22 VOID
23 )
24 {
25 //
26 // Retrieves the OpenSSL MD5 Context Size
27 //
28 return (UINTN) (sizeof (MD5_CTX));
29 }
30
31
32 /**
33 Initializes user-supplied memory pointed by Md5Context as MD5 hash context for
34 subsequent use.
35
36 If Md5Context is NULL, then return FALSE.
37
38 @param[out] Md5Context Pointer to MD5 context being initialized.
39
40 @retval TRUE MD5 context initialization succeeded.
41 @retval FALSE MD5 context initialization failed.
42
43 **/
44 BOOLEAN
45 EFIAPI
46 Md5Init (
47 OUT VOID *Md5Context
48 )
49 {
50 //
51 // Check input parameters.
52 //
53 if (Md5Context == NULL) {
54 return FALSE;
55 }
56
57 //
58 // OpenSSL MD5 Context Initialization
59 //
60 return (BOOLEAN) (MD5_Init ((MD5_CTX *) Md5Context));
61 }
62
63 /**
64 Makes a copy of an existing MD5 context.
65
66 If Md5Context is NULL, then return FALSE.
67 If NewMd5Context is NULL, then return FALSE.
68
69 @param[in] Md5Context Pointer to MD5 context being copied.
70 @param[out] NewMd5Context Pointer to new MD5 context.
71
72 @retval TRUE MD5 context copy succeeded.
73 @retval FALSE MD5 context copy failed.
74
75 **/
76 BOOLEAN
77 EFIAPI
78 Md5Duplicate (
79 IN CONST VOID *Md5Context,
80 OUT VOID *NewMd5Context
81 )
82 {
83 //
84 // Check input parameters.
85 //
86 if (Md5Context == NULL || NewMd5Context == NULL) {
87 return FALSE;
88 }
89
90 CopyMem (NewMd5Context, Md5Context, sizeof (MD5_CTX));
91
92 return TRUE;
93 }
94
95 /**
96 Digests the input data and updates MD5 context.
97
98 This function performs MD5 digest on a data buffer of the specified size.
99 It can be called multiple times to compute the digest of long or discontinuous data streams.
100 MD5 context should be already correctly initialized by Md5Init(), and should not be finalized
101 by Md5Final(). Behavior with invalid context is undefined.
102
103 If Md5Context is NULL, then return FALSE.
104
105 @param[in, out] Md5Context Pointer to the MD5 context.
106 @param[in] Data Pointer to the buffer containing the data to be hashed.
107 @param[in] DataSize Size of Data buffer in bytes.
108
109 @retval TRUE MD5 data digest succeeded.
110 @retval FALSE MD5 data digest failed.
111
112 **/
113 BOOLEAN
114 EFIAPI
115 Md5Update (
116 IN OUT VOID *Md5Context,
117 IN CONST VOID *Data,
118 IN UINTN DataSize
119 )
120 {
121 //
122 // Check input parameters.
123 //
124 if (Md5Context == NULL) {
125 return FALSE;
126 }
127
128 //
129 // Check invalid parameters, in case that only DataLength was checked in OpenSSL
130 //
131 if (Data == NULL && (DataSize != 0)) {
132 return FALSE;
133 }
134
135 //
136 // OpenSSL MD5 Hash Update
137 //
138 return (BOOLEAN) (MD5_Update ((MD5_CTX *) Md5Context, Data, DataSize));
139 }
140
141 /**
142 Completes computation of the MD5 digest value.
143
144 This function completes MD5 hash computation and retrieves the digest value into
145 the specified memory. After this function has been called, the MD5 context cannot
146 be used again.
147 MD5 context should be already correctly initialized by Md5Init(), and should not be
148 finalized by Md5Final(). Behavior with invalid MD5 context is undefined.
149
150 If Md5Context is NULL, then return FALSE.
151 If HashValue is NULL, then return FALSE.
152
153 @param[in, out] Md5Context Pointer to the MD5 context.
154 @param[out] HashValue Pointer to a buffer that receives the MD5 digest
155 value (16 bytes).
156
157 @retval TRUE MD5 digest computation succeeded.
158 @retval FALSE MD5 digest computation failed.
159
160 **/
161 BOOLEAN
162 EFIAPI
163 Md5Final (
164 IN OUT VOID *Md5Context,
165 OUT UINT8 *HashValue
166 )
167 {
168 //
169 // Check input parameters.
170 //
171 if (Md5Context == NULL || HashValue == NULL) {
172 return FALSE;
173 }
174
175 //
176 // OpenSSL MD5 Hash Finalization
177 //
178 return (BOOLEAN) (MD5_Final (HashValue, (MD5_CTX *) Md5Context));
179 }
180
181 /**
182 Computes the MD5 message digest of a input data buffer.
183
184 This function performs the MD5 message digest of a given data buffer, and places
185 the digest value into the specified memory.
186
187 If this interface is not supported, then return FALSE.
188
189 @param[in] Data Pointer to the buffer containing the data to be hashed.
190 @param[in] DataSize Size of Data buffer in bytes.
191 @param[out] HashValue Pointer to a buffer that receives the MD5 digest
192 value (16 bytes).
193
194 @retval TRUE MD5 digest computation succeeded.
195 @retval FALSE MD5 digest computation failed.
196 @retval FALSE This interface is not supported.
197
198 **/
199 BOOLEAN
200 EFIAPI
201 Md5HashAll (
202 IN CONST VOID *Data,
203 IN UINTN DataSize,
204 OUT UINT8 *HashValue
205 )
206 {
207 //
208 // Check input parameters.
209 //
210 if (HashValue == NULL) {
211 return FALSE;
212 }
213 if (Data == NULL && (DataSize != 0)) {
214 return FALSE;
215 }
216
217 //
218 // OpenSSL MD5 Hash Computation.
219 //
220 if (MD5 (Data, DataSize, HashValue) == NULL) {
221 return FALSE;
222 } else {
223 return TRUE;
224 }
225 }