65#ifdef FUN_WITH_OPENSSL
66#include <openssl/evp.h>
74#ifndef EVP_MD_get_size
97 static const char hexdig[] =
"0123456789abcdef";
98 if (!data && len != 0)
return NULL;
99#ifdef FUN_WITH_OPENSSL
100 const EVP_MD *md = EVP_md5();
101 if (!md)
return NULL;
103 if (dlen <= 0)
return NULL;
104 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
105 if (!digest)
return NULL;
106 unsigned int out_len = 0;
110 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
112 ok = EVP_Digest(data, len, digest, &out_len, md, NULL);
114 if (ok != 1 || (
int)out_len != dlen) {
118 char *hex = (
char *)malloc((
size_t)dlen * 2 + 1);
123 for (
int i = 0; i < dlen; ++i) {
124 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
125 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
127 hex[dlen * 2] =
'\0';
131 char *hex = (
char *)malloc(1);
132 if (hex) hex[0] =
'\0';
152 static const char hexdig[] =
"0123456789abcdef";
153 if (!data && len != 0)
return NULL;
154#ifdef FUN_WITH_OPENSSL
155 const EVP_MD *md = EVP_sha256();
156 if (!md)
return NULL;
158 if (dlen <= 0)
return NULL;
159 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
160 if (!digest)
return NULL;
161 unsigned int out_len = 0;
164 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
166 ok = EVP_Digest(data, len, digest, &out_len, md, NULL);
168 if (ok != 1 || (
int)out_len != dlen) {
172 char *hex = (
char *)malloc((
size_t)dlen * 2 + 1);
177 for (
int i = 0; i < dlen; ++i) {
178 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
179 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
181 hex[dlen * 2] =
'\0';
185 char *hex = (
char *)malloc(1);
186 if (hex) hex[0] =
'\0';
206 static const char hexdig[] =
"0123456789abcdef";
207 if (!data && len != 0)
return NULL;
208#ifdef FUN_WITH_OPENSSL
209 const EVP_MD *md = EVP_sha512();
210 if (!md)
return NULL;
212 if (dlen <= 0)
return NULL;
213 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
214 if (!digest)
return NULL;
215 unsigned int out_len = 0;
218 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
220 ok = EVP_Digest(data, len, digest, &out_len, md, NULL);
222 if (ok != 1 || (
int)out_len != dlen) {
226 char *hex = (
char *)malloc((
size_t)dlen * 2 + 1);
231 for (
int i = 0; i < dlen; ++i) {
232 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
233 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
235 hex[dlen * 2] =
'\0';
239 char *hex = (
char *)malloc(1);
240 if (hex) hex[0] =
'\0';
263 static const char hexdig[] =
"0123456789abcdef";
264 if (!data && len != 0)
return NULL;
265#ifdef FUN_WITH_OPENSSL
266 const EVP_MD *md = EVP_ripemd160();
267 if (!md)
return NULL;
269 if (dlen <= 0)
return NULL;
270 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
271 if (!digest)
return NULL;
272 unsigned int out_len = 0;
275 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
277 ok = EVP_Digest(data, len, digest, &out_len, md, NULL);
279 if (ok != 1 || (
int)out_len != dlen) {
283 char *hex = (
char *)malloc((
size_t)dlen * 2 + 1);
288 for (
int i = 0; i < dlen; ++i) {
289 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
290 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
292 hex[dlen * 2] =
'\0';
296 char *hex = (
char *)malloc(1);
297 if (hex) hex[0] =
'\0';
static char * fun_openssl_sha512_hex(const unsigned char *data, size_t len)
Compute SHA-512 and return it as a lowercase hexadecimal string.
static char * fun_openssl_ripemd160_hex(const unsigned char *data, size_t len)
Compute RIPEMD-160 and return it as a lowercase hexadecimal string.
static char * fun_openssl_sha256_hex(const unsigned char *data, size_t len)
Compute SHA-256 and return it as a lowercase hexadecimal string.
static char * fun_openssl_md5_hex(const unsigned char *data, size_t len)
Compute MD5 and return it as a lowercase hexadecimal string.
int EVP_MD_get_size(const EVP_MD *md)
Forward declaration for EVP_MD_get_size on older headers.