/* This file is part of Mailfromd. Copyright (C) 2020 Sergey Poznyakoff This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* DKIM implementation defines */ /* Verification result codes are defined in status.h */ #include /* Canonicalization types. */ enum { DKIM_CANON_ERR = -1, DKIM_CANON_SIMPLE, DKIM_CANON_RELAXED }; #define DKIM_VERSION "1" #define DKIM_KEYRECORD_VERSION "DKIM1" #define DKIM_SIGNATURE_HEADER "DKIM-Signature" #define DKIM_QUERY_METHOD "dns/txt" #define DKIM_ALGORITHM "rsa-sha256" /* Special value for the signature "l" member */ #define DKIM_LENGTH_ALL ((size_t)~0) /* * Structure governing creation and verification of a DKIM signature. * Most members are named after the DKIM-Signature tags. * See RFC 6376, 3.5. "The DKIM-Signature Header Field" (page 17). */ struct dkim_signature { char *a; uint8_t *b; uint8_t *bh; int canon[2]; char *d; char *s; char *h; char *i; size_t l; char *q; time_t t; time_t x; char *v; }; /* Convert canonicalization type to a DKIM_CANON_ constant. */ int dkim_str_to_canon_type(char const *str, char **endp); /* * Create canonicalizer filter for STREAM. Use canonicalization types * supplied by CANON_HEADER and CANON_BODY. FLAGS are mailutils stream * flags (normally MU_STREAM_READ). */ int dkim_canonicalizer_create(mu_stream_t *pstream, mu_stream_t stream, int canon_header, int canon_body, int flags); /* * Sign the message MSG using the SIG and private key PRIV_KEY. * Return the created DKIM-Signature header in RET_SIGHDR. */ int mfd_dkim_sign(mu_message_t msg, struct dkim_signature *sig, char *priv_key, char **ret_sighdr); int dkim_header_list_match(char const *h_list, char const *h); /* Explanatory error codes */ enum { DKIM_EXPL_OK = _MFL_DKIM_EXPL_OK, DKIM_EXPL_NO_SIG = _MFL_DKIM_EXPL_NO_SIG, DKIM_EXPL_INTERNAL_ERROR = _MFL_DKIM_EXPL_INTERNAL_ERROR, DKIM_EXPL_SIG_SYNTAX = _MFL_DKIM_EXPL_SIG_SYNTAX, DKIM_EXPL_SIG_MISS = _MFL_DKIM_EXPL_SIG_MISS, DKIM_EXPL_DOMAIN_MISMATCH = _MFL_DKIM_EXPL_DOMAIN_MISMATCH, DKIM_EXPL_BAD_VERSION = _MFL_DKIM_EXPL_BAD_VERSION, DKIM_EXPL_BAD_ALGORITHM = _MFL_DKIM_EXPL_BAD_ALGORITHM, DKIM_EXPL_BAD_QUERY = _MFL_DKIM_EXPL_BAD_QUERY, DKIM_EXPL_FROM = _MFL_DKIM_EXPL_FROM, DKIM_EXPL_EXPIRED = _MFL_DKIM_EXPL_EXPIRED, DKIM_EXPL_DNS_UNAVAIL = _MFL_DKIM_EXPL_DNS_UNAVAIL, DKIM_EXPL_DNS_NOTFOUND = _MFL_DKIM_EXPL_DNS_NOTFOUND, DKIM_EXPL_KEY_SYNTAX = _MFL_DKIM_EXPL_KEY_SYNTAX, DKIM_EXPL_KEY_REVOKED = _MFL_DKIM_EXPL_KEY_REVOKED, DKIM_EXPL_BAD_BODY = _MFL_DKIM_EXPL_BAD_BODY, DKIM_EXPL_BAD_BASE64 = _MFL_DKIM_EXPL_BAD_BASE64, DKIM_EXPL_BAD_SIG = _MFL_DKIM_EXPL_BAD_SIG, }; /* Verification error codes */ enum { DKIM_VERIFY_OK = _MFL_DKIM_VERIFY_OK, DKIM_VERIFY_PERMFAIL = _MFL_DKIM_VERIFY_PERMFAIL, DKIM_VERIFY_TEMPFAIL = _MFL_DKIM_VERIFY_TEMPFAIL, }; int mfd_dkim_verify(mu_message_t msg, char **sigstr); extern char const *dkim_explanation_str[]; extern int dkim_result_trans[];