24#ifdef FUN_WITH_OPENSSL 25#include <openssl/evp.h> 28#ifndef EVP_MD_get_size 29int EVP_MD_get_size(
const EVP_MD *md);
44static char *fun_openssl_md5_hex(
const unsigned char *data,
size_t len) {
45 static const char hexdig[] =
"0123456789abcdef";
46 if (!data &&
len != 0)
return NULL;
47#ifdef FUN_WITH_OPENSSL 48 const EVP_MD *md = EVP_md5();
50 int dlen = EVP_MD_get_size(md);
51 if (dlen <= 0)
return NULL;
52 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
53 if (!digest)
return NULL;
54 unsigned int out_len = 0;
58 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
60 ok = EVP_Digest(data,
len, digest, &out_len, md, NULL);
62 if (
ok != 1 || (
int)out_len != dlen) {
66 char *
hex = (
char *)malloc((
size_t)dlen * 2 + 1);
71 for (
int i = 0; i < dlen; ++i) {
72 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
73 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
79 char *
hex = (
char *)malloc(1);
94static char *fun_openssl_sha256_hex(
const unsigned char *data,
size_t len) {
95 static const char hexdig[] =
"0123456789abcdef";
96 if (!data &&
len != 0)
return NULL;
97#ifdef FUN_WITH_OPENSSL 98 const EVP_MD *md = EVP_sha256();
100 int dlen = EVP_MD_get_size(md);
101 if (dlen <= 0)
return NULL;
102 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
103 if (!digest)
return NULL;
104 unsigned int out_len = 0;
107 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
109 ok = EVP_Digest(data,
len, digest, &out_len, md, NULL);
111 if (
ok != 1 || (
int)out_len != dlen) {
115 char *
hex = (
char *)malloc((
size_t)dlen * 2 + 1);
120 for (
int i = 0; i < dlen; ++i) {
121 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
122 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
124 hex[dlen * 2] =
'\0';
128 char *
hex = (
char *)malloc(1);
143static char *fun_openssl_sha512_hex(
const unsigned char *data,
size_t len) {
144 static const char hexdig[] =
"0123456789abcdef";
145 if (!data &&
len != 0)
return NULL;
146#ifdef FUN_WITH_OPENSSL 147 const EVP_MD *md = EVP_sha512();
148 if (!md)
return NULL;
149 int dlen = EVP_MD_get_size(md);
150 if (dlen <= 0)
return NULL;
151 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
152 if (!digest)
return NULL;
153 unsigned int out_len = 0;
156 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
158 ok = EVP_Digest(data,
len, digest, &out_len, md, NULL);
160 if (
ok != 1 || (
int)out_len != dlen) {
164 char *
hex = (
char *)malloc((
size_t)dlen * 2 + 1);
169 for (
int i = 0; i < dlen; ++i) {
170 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
171 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
173 hex[dlen * 2] =
'\0';
177 char *
hex = (
char *)malloc(1);
196static char *fun_openssl_ripemd160_hex(
const unsigned char *data,
size_t len) {
197 static const char hexdig[] =
"0123456789abcdef";
198 if (!data &&
len != 0)
return NULL;
199#ifdef FUN_WITH_OPENSSL 200 const EVP_MD *md = EVP_ripemd160();
201 if (!md)
return NULL;
202 int dlen = EVP_MD_get_size(md);
203 if (dlen <= 0)
return NULL;
204 unsigned char *digest = (
unsigned char *)malloc((
size_t)dlen);
205 if (!digest)
return NULL;
206 unsigned int out_len = 0;
209 ok = EVP_Digest(NULL, 0, digest, &out_len, md, NULL);
211 ok = EVP_Digest(data,
len, digest, &out_len, md, NULL);
213 if (
ok != 1 || (
int)out_len != dlen) {
217 char *
hex = (
char *)malloc((
size_t)dlen * 2 + 1);
222 for (
int i = 0; i < dlen; ++i) {
223 hex[2 * i] = hexdig[(digest[i] >> 4) & 0xF];
224 hex[2 * i + 1] = hexdig[digest[i] & 0xF];
226 hex[dlen * 2] =
'\0';
230 char *
hex = (
char *)malloc(1);