1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*
* Exim - an Internet mail transport agent
* Copyright (c) The Exim Maintainers 1995 - 2022
*
* Hash interface functions
*/
#include "exim.h"
#if !defined(HASH_H) /* entire file */
#define HASH_H
#include "sha_ver.h"
#ifdef SHA_OPENSSL
# include <openssl/sha.h>
#elif defined SHA_GNUTLS
# include <gnutls/crypto.h>
#elif defined(SHA_GCRYPT)
# include <gcrypt.h>
#elif defined(SHA_POLARSSL)
# include "pdkim/pdkim.h" /*XXX ugly */
# include "pdkim/polarssl/sha1.h"
# include "pdkim/polarssl/sha2.h"
#endif
/* Hash context for the exim_sha_* routines */
typedef enum hashmethod {
HASH_BADTYPE,
HASH_NULL,
HASH_SHA1,
HASH_SHA2_256,
HASH_SHA2_384,
HASH_SHA2_512,
HASH_SHA3_224,
HASH_SHA3_256,
HASH_SHA3_384,
HASH_SHA3_512,
} hashmethod;
typedef struct {
hashmethod method;
int hashlen;
#ifdef SHA_OPENSSL
union {
SHA_CTX sha1; /* SHA1 block */
SHA256_CTX sha2_256; /* SHA256 or 224 block */
SHA512_CTX sha2_512; /* SHA512 or 384 block */
#ifdef EXIM_HAVE_SHA3
EVP_MD_CTX * mctx; /* SHA3 block */
#endif
} u;
#elif defined(SHA_GNUTLS)
gnutls_hash_hd_t sha; /* Either SHA1 or SHA256 block */
#elif defined(SHA_GCRYPT)
gcry_md_hd_t sha; /* Either SHA1 or SHA256 block */
#elif defined(SHA_POLARSSL)
union {
sha1_context sha1; /* SHA1 block */
sha2_context sha2; /* SHA256 block */
} u;
#elif defined(SHA_NATIVE)
sha1 sha1;
#endif
} hctx;
extern BOOL exim_sha_init(hctx *, hashmethod);
extern void exim_sha_update(hctx *, const uschar *a, int);
extern void exim_sha_update_string(hctx *, const uschar *a);
extern void exim_sha_finish(hctx *, blob *);
#endif
/* End of File */
|