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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#ifndef SRS2_H
#define SRS2_H
#include <stdint.h>
#include <time.h>
/* Adjusted to s/qmail (feh) */
/* Copyright (c) 2004 Shevek (srs@anarres.org)
* All rights reserved.
*
* This file is a part of libsrs2 from http://www.libsrs2.org/
*
* Redistribution and use in source and binary forms, with or without
* modification, under the terms of either the GNU General Public
* License version 2 or the BSD license, at the discretion of the
* user. Copies of these licenses have been included in the libsrs2
* distribution. See the the file called LICENSE for more
* information.
*/
/* This is ugly, but reasonably safe. */
#undef TRUE
#define TRUE 1
#undef FALSE
#define FALSE 0
#define SRSSEP '='
#define SRS0TAG "SRS0"
#define SRS1TAG "SRS1"
/* Error codes */
#define SRS_ERRTYPE_MASK 0xf000
#define SRS_ERRTYPE_NONE 0x0000
#define SRS_ERRTYPE_CONFIG 0x1000
#define SRS_ERRTYPE_INPUT 0x2000
#define SRS_ERRTYPE_SYNTAX 0x4000
#define SRS_ERRTYPE_SRS 0x8000
#define SRS_SUCCESS (0)
#define SRS_ENOTSRSADDRESS (1)
#define SRS_ENOTREWRITTEN (2)
#define SRS_ENOSECRETS (SRS_ERRTYPE_CONFIG | 1)
#define SRS_ESEPARATORINVALID (SRS_ERRTYPE_CONFIG | 2)
#define SRS_ENOSENDERATSIGN (SRS_ERRTYPE_INPUT | 1)
#define SRS_EBUFTOOSMALL (SRS_ERRTYPE_INPUT | 2)
#define SRS_ENOSRS0HOST (SRS_ERRTYPE_SYNTAX | 1)
#define SRS_ENOSRS0USER (SRS_ERRTYPE_SYNTAX | 2)
#define SRS_ENOSRS0HASH (SRS_ERRTYPE_SYNTAX | 3)
#define SRS_ENOSRS0STAMP (SRS_ERRTYPE_SYNTAX | 4)
#define SRS_ENOSRS1HOST (SRS_ERRTYPE_SYNTAX | 5)
#define SRS_ENOSRS1USER (SRS_ERRTYPE_SYNTAX | 6)
#define SRS_ENOSRS1HASH (SRS_ERRTYPE_SYNTAX | 7)
#define SRS_EBADTIMESTAMPCHAR (SRS_ERRTYPE_SYNTAX | 8)
#define SRS_EHASHTOOSHORT (SRS_ERRTYPE_SYNTAX | 9)
#define SRS_ETIMESTAMPOUTOFDATE (SRS_ERRTYPE_SRS | 1)
#define SRS_EHASHINVALID (SRS_ERRTYPE_SRS | 2)
#define SRS_ERROR_TYPE(x) ((x) & SRS_ERRTYPE_MASK)
/* SRS implementation */
#define SRS_IS_SRS_ADDRESS(x) \
((strncasecmp((x), "SRS", 3) == 0) && (strchr("01", (x)[3]) != NULL) \
&& (strchr("-+=", (x)[4]) != NULL))
typedef void *(*srs_malloc_t)(size_t);
typedef void *(*srs_realloc_t)(void *, size_t);
typedef void (*srs_free_t)(void *);
typedef int srs_bool;
typedef struct _srs_t {
/* Rewriting parameters */
// stralloc cookies;
char **secrets;
int numsecrets;
char separator;
/* Security parameters */
int maxage; /* Maximum allowed age in seconds */
int hashlen;
int hashmin;
/* Behaviour parameters */
srs_bool alwaysrewrite; /* Rewrite even into same domain? */
srs_bool noforward; /* Never perform forwards rewriting */
srs_bool noreverse; /* Never perform reverse rewriting */
char **neverrewrite; /* A list of non-rewritten domains */
} srs_t;
/* Interface */
int srs_set_malloc(srs_malloc_t m, srs_realloc_t r, srs_free_t f);
srs_t *srs_new(void);
void srs_init(srs_t *);
void srs_free(srs_t *);
int srs_forward(srs_t *, char *, int, const char *, const char *);
int srs_forward_alloc(srs_t *, char **, const char *, const char *);
int srs_reverse(srs_t *, char *, int, const char *);
int srs_reverse_alloc(srs_t *, char **, const char *);
const char *srs_strerror(int);
int srs_add_secret(srs_t *, const char *);
const char *srs_get_secret(srs_t *, int);
/* You probably shouldn't call these. */
int srs_timestamp_create(srs_t *, char *, time_t);
int srs_timestamp_check(srs_t *, const char *);
#define SRS_PARAM_DECLARE(n, t) \
int srs_set_##n(srs_t *srs, t value); \
t srs_get_##n(srs_t *srs);
SRS_PARAM_DECLARE(alwaysrewrite, srs_bool)
SRS_PARAM_DECLARE(separator, char)
SRS_PARAM_DECLARE(maxage, int)
SRS_PARAM_DECLARE(hashlen, int)
SRS_PARAM_DECLARE(hashmin, int)
SRS_PARAM_DECLARE(noforward, srs_bool)
SRS_PARAM_DECLARE(noreverse, srs_bool)
#endif /* SRS2_H */
|