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