2018-04-24 12:33:55 -04:00
|
|
|
#ifndef SHA512_H
|
|
|
|
#define SHA512_H
|
|
|
|
|
2019-04-07 10:58:14 -04:00
|
|
|
#include <assert.h>
|
|
|
|
|
2019-04-07 11:05:16 -04:00
|
|
|
typedef struct {
|
|
|
|
void* context;
|
|
|
|
} sha512_context;
|
2019-04-07 10:58:14 -04:00
|
|
|
|
|
|
|
typedef struct sha512_functions_ {
|
|
|
|
int(*_ed_sha512_init)(sha512_context*);
|
|
|
|
int(*_ed_sha512_final)(sha512_context*, unsigned char *);
|
|
|
|
int(*_ed_sha512_update)(sha512_context*, const unsigned char *, size_t);
|
|
|
|
} sha512_functions;
|
2019-04-10 16:21:45 -04:00
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
__declspec(dllexport)
|
|
|
|
#endif
|
2019-04-07 10:58:14 -04:00
|
|
|
extern sha512_functions _ed_sha512_functions;
|
|
|
|
|
2019-04-07 10:59:49 -04:00
|
|
|
inline void _ed_sha512_validate() {
|
2019-04-07 10:58:14 -04:00
|
|
|
assert(_ed_sha512_functions._ed_sha512_init);
|
|
|
|
assert(_ed_sha512_functions._ed_sha512_final);
|
|
|
|
assert(_ed_sha512_functions._ed_sha512_update);
|
|
|
|
}
|
2019-04-07 10:59:49 -04:00
|
|
|
inline int _ed_sha512(const unsigned char *message, size_t message_len, unsigned char *out) {
|
2019-04-07 10:58:14 -04:00
|
|
|
_ed_sha512_validate();
|
|
|
|
|
|
|
|
int result = 1;
|
|
|
|
sha512_context ctx;
|
|
|
|
result &= _ed_sha512_functions._ed_sha512_init(&ctx);
|
|
|
|
result &= _ed_sha512_functions._ed_sha512_update(&ctx, message, message_len);
|
|
|
|
result &= _ed_sha512_functions._ed_sha512_final(&ctx, out);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2018-04-24 12:33:55 -04:00
|
|
|
#endif
|