s/qmail 4.4.12
Next generation secure email transport
Loading...
Searching...
No Matches
srsq.h
Go to the documentation of this file.
1#ifndef SRSQ_H
2#define SRSQ_H
3#include <stdint.h>
4#include <time.h>
5#include "str.h"
6#include "case.h"
7#include "stralloc.h"
8
9/* Original copyright (c) 2004 Shevek (srs@anarres.org)
10 * adapted for fehQlibs, 2025 feh
11 */
12
13#define SRSDEL '='
14#define SRSSEP "="
15#define SRS0TAG "SRS0"
16#define SRS1TAG "SRS1"
17#define SRS_HASHLEN 3
18
19/* Error codes */
20
21#define SRS_ERRTYPE_MASK 0xf000
22#define SRS_ERRTYPE_NONE 0x0000
23#define SRS_ERRTYPE_CONFIG 0x1000
24#define SRS_ERRTYPE_OPER 0x2000
25#define SRS_ERRTYPE_SYNTAX 0x4000
26#define SRS_ERRTYPE_SRS 0x8000
27
28#define SRS_SUCCESS (0)
29#define SRS_ENOTSRSADDRESS (1)
30#define SRS_ENOTREWRITTEN (2)
31#define SRS_ENOSENDERATSIGN (3)
32
33#define SRS_ENOSECRETS (SRS_ERRTYPE_CONFIG | 1)
34#define SRS_ESEPARATORINVALID (SRS_ERRTYPE_CONFIG | 2)
35
36#define SRS_EOUTOFMEMORY (SRS_ERRTYPE_OPER | 1)
37
38#define SRS_ENOSRS0HOST (SRS_ERRTYPE_SYNTAX | 1)
39#define SRS_ENOSRS0USER (SRS_ERRTYPE_SYNTAX | 2)
40#define SRS_ENOSRS0HASH (SRS_ERRTYPE_SYNTAX | 3)
41#define SRS_ENOSRS0STAMP (SRS_ERRTYPE_SYNTAX | 4)
42#define SRS_ENOSRS1HOST (SRS_ERRTYPE_SYNTAX | 5)
43#define SRS_ENOSRS1USER (SRS_ERRTYPE_SYNTAX | 6)
44#define SRS_ENOSRS1HASH (SRS_ERRTYPE_SYNTAX | 7)
45#define SRS_EBADTIMESTAMPCHAR (SRS_ERRTYPE_SYNTAX | 8)
46#define SRS_EHASHTOOSHORT (SRS_ERRTYPE_SYNTAX | 9)
47
48#define SRS_ETIMESTAMPOUTOFDATE (SRS_ERRTYPE_SRS | 1)
49#define SRS_EHASHINVALID (SRS_ERRTYPE_SRS | 2)
50
51#define SRS_ERROR_TYPE(x) ((x) & SRS_ERRTYPE_MASK)
52
53/* SRS implementation */
54
55#define SRS_IS_SRS_ADDRESS(x) ( \
56 (case_diffb((x),3,"SRS") == 0) && \
57 (str_chr("01", (x)[3]) != 2) && \
58 (str_chr("-+=", (x)[4]) != 4) \
59)
60
61#define X(e,s) if (code == e) return s;
62
63/* The main building block */
64
65typedef struct {
66 /* Rewriting parameters */
67 stralloc secrets;
70
71 /* Security parameters */
72 int maxage; /* Maximum allowed age in seconds */
75
76 /* Behaviour parameters */
77 int alwaysrewrite; /* Rewrite even into same domain? */
78 int noforward; /* Never perform forwards rewriting */
79 int noreverse; /* Never perform reverse rewriting */
80 stralloc nonrewrite; /* A list of non-rewritten domains */
81} srs_ctx;
82
83/* Interface */
84int srs_init(srs_ctx *);
85int srs_forward(srs_ctx *,stralloc *,const char *,const char *);
86int srs_reverse(srs_ctx *,stralloc *,char *);
87const char *srs_errorstr(int);
88 /* You probably shouldn't call these. */
89int srs_create_timestamp(char *,time_t);
90int srs_check_timestamp(srs_ctx *,char *);
91
92#endif /* SRSQ_H */
int srs_init(srs_ctx *)
Definition: srsq.c:62
int srs_check_timestamp(srs_ctx *, char *)
Definition: srsq.c:101
const char * srs_errorstr(int)
Definition: srsq.c:29
int srs_create_timestamp(char *, time_t)
Definition: srsq.c:89
int srs_reverse(srs_ctx *, stralloc *, char *)
Definition: srsq.c:324
int srs_forward(srs_ctx *, stralloc *, const char *, const char *)
Definition: srsq.c:360
Definition: srsq.h:65
stralloc nonrewrite
Definition: srsq.h:80
int hashlen
Definition: srsq.h:73
int alwaysrewrite
Definition: srsq.h:77
int hashmin
Definition: srsq.h:74
char separator
Definition: srsq.h:69
int noreverse
Definition: srsq.h:79
int maxage
Definition: srsq.h:72
int noforward
Definition: srsq.h:78
stralloc secrets
Definition: srsq.h:67
int numsecrets
Definition: srsq.h:68