7760ce73f4972fb9c9f871ce045b54e190846c4a
[exim.git] / src / src / pdkim / signing.h
1 /*
2  *  PDKIM - a RFC4871 (DKIM) implementation
3  *
4  *  Copyright (C) 1995 - 2020  Exim maintainers
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *
7  *  RSA signing/verification interface
8  */
9
10 #include "../exim.h"
11
12 #ifndef DISABLE_DKIM    /* entire file */
13
14 #include "crypt_ver.h"
15
16 #ifdef SIGN_OPENSSL
17 # include <openssl/rsa.h>
18 # include <openssl/ssl.h>
19 # include <openssl/err.h>
20 #elif defined(SIGN_GNUTLS)
21 # include <gnutls/gnutls.h>
22 # include <gnutls/x509.h>
23 # include <gnutls/abstract.h>
24 #elif defined(SIGN_GCRYPT)
25 # include <gcrypt.h>
26 # include <libtasn1.h>
27 #endif
28
29 #include "../blob.h"
30
31 typedef enum {
32   KEYTYPE_RSA,
33   KEYTYPE_ED25519
34 } keytype;
35
36 typedef enum {
37   KEYFMT_DER,           /* an asn.1 structure */
38   KEYFMT_ED25519_BARE   /* just the key */
39 } keyformat;
40
41
42 #ifdef SIGN_OPENSSL
43
44 typedef struct {
45   keytype       keytype;
46   EVP_PKEY *    key;
47 } es_ctx;
48
49 typedef struct {
50   keytype       keytype;
51   EVP_PKEY *    key;
52 } ev_ctx;
53
54 #elif defined(SIGN_GNUTLS)
55
56 typedef struct {
57   keytype       keytype;
58   gnutls_privkey_t key;
59 } es_ctx;
60
61 typedef struct {
62   keytype       keytype;
63   gnutls_pubkey_t key;
64 } ev_ctx;
65
66 #elif defined(SIGN_GCRYPT)
67
68 typedef struct {
69   keytype       keytype;
70   gcry_mpi_t n;
71   gcry_mpi_t e;
72   gcry_mpi_t d;
73   gcry_mpi_t p;
74   gcry_mpi_t q;
75   gcry_mpi_t dp;
76   gcry_mpi_t dq;
77   gcry_mpi_t qp;
78 } es_ctx;
79
80 typedef struct {
81   keytype       keytype;
82   gcry_mpi_t n;
83   gcry_mpi_t e;
84 } ev_ctx;
85
86 #endif
87
88
89 extern void exim_dkim_init(void);
90 extern gstring * exim_dkim_data_append(gstring *, uschar *);
91
92 extern const uschar * exim_dkim_signing_init(const uschar *, es_ctx *);
93 extern const uschar * exim_dkim_sign(es_ctx *, hashmethod, blob *, blob *);
94 extern const uschar * exim_dkim_verify_init(blob *, keyformat, ev_ctx *, unsigned *);
95 extern const uschar * exim_dkim_verify(ev_ctx *, hashmethod, blob *, blob *);
96
97 #endif  /*DISABLE_DKIM*/
98 /* End of File */