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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
* PDKIM - a RFC4871 (DKIM) implementation
*
* Copyright (C) 1995 - 2020 Exim maintainers
*
* RSA signing/verification interface
*/
#include "../exim.h"
#ifndef DISABLE_DKIM /* entire file */
#include "crypt_ver.h"
#ifdef SIGN_OPENSSL
# include <openssl/rsa.h>
# include <openssl/ssl.h>
# include <openssl/err.h>
#elif defined(SIGN_GNUTLS)
# include <gnutls/gnutls.h>
# include <gnutls/x509.h>
# include <gnutls/abstract.h>
#elif defined(SIGN_GCRYPT)
# include <gcrypt.h>
# include <libtasn1.h>
#endif
#include "../blob.h"
typedef enum {
KEYTYPE_RSA,
KEYTYPE_ED25519
} keytype;
typedef enum {
KEYFMT_DER, /* an asn.1 structure */
KEYFMT_ED25519_BARE /* just the key */
} keyformat;
#ifdef SIGN_OPENSSL
typedef struct {
keytype keytype;
EVP_PKEY * key;
} es_ctx;
typedef struct {
keytype keytype;
EVP_PKEY * key;
} ev_ctx;
#elif defined(SIGN_GNUTLS)
typedef struct {
keytype keytype;
gnutls_privkey_t key;
} es_ctx;
typedef struct {
keytype keytype;
gnutls_pubkey_t key;
} ev_ctx;
#elif defined(SIGN_GCRYPT)
typedef struct {
keytype keytype;
gcry_mpi_t n;
gcry_mpi_t e;
gcry_mpi_t d;
gcry_mpi_t p;
gcry_mpi_t q;
gcry_mpi_t dp;
gcry_mpi_t dq;
gcry_mpi_t qp;
} es_ctx;
typedef struct {
keytype keytype;
gcry_mpi_t n;
gcry_mpi_t e;
} ev_ctx;
#endif
extern void exim_dkim_init(void);
extern gstring * exim_dkim_data_append(gstring *, uschar *);
extern const uschar * exim_dkim_signing_init(const uschar *, es_ctx *);
extern const uschar * exim_dkim_sign(es_ctx *, hashmethod, blob *, blob *);
extern const uschar * exim_dkim_verify_init(blob *, keyformat, ev_ctx *, unsigned *);
extern const uschar * exim_dkim_verify(ev_ctx *, hashmethod, blob *, blob *);
#endif /*DISABLE_DKIM*/
/* End of File */
|