DMARC: add results to generic authres string; remove $dmarc_ar_header
[exim.git] / src / src / auths / xtextdecode.c
CommitLineData
0756eb3c
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
0a49a7a4 5/* Copyright (c) University of Cambridge 1995 - 2009 */
0756eb3c
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8#include "../exim.h"
9
10
11/*************************************************
12* Decode byte-string in xtext *
13*************************************************/
14
15/* This function decodes a string in xtextformat as defined in RFC 1891 and
16required by the SMTP AUTH extension (RFC 2554). We put the result in a piece of
17store of equal length - it cannot be longer than this. Although in general the
18result of decoding an xtext may be binary, in the context in which it is used
19by Exim (for decoding the value of AUTH on a MAIL command), the result is
20expected to be an addr-spec. We therefore add on a terminating zero, for
21convenience.
22
23Arguments:
24 code points to the coded string, zero-terminated
25 ptr where to put the pointer to the result, which is in
26 dynamic store
27
28Returns: the number of bytes in the result, excluding the final zero;
29 -1 if the input is malformed
30*/
31
32int
33auth_xtextdecode(uschar *code, uschar **ptr)
34{
35register int x;
36uschar *result = store_get(Ustrlen(code) + 1);
37*ptr = result;
38
39while ((x = (*code++)) != 0)
40 {
41 if (x < 33 || x > 127 || x == '=') return -1;
42 if (x == '+')
43 {
44 register int y;
45 if (!isxdigit((x = (*code++)))) return -1;
46 y = ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10)) << 4;
47 if (!isxdigit((x = (*code++)))) return -1;
48 *result++ = y | ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10));
49 }
50 else *result++ = x;
51 }
52
53*result = 0;
54return result - *ptr;
55}
56
57/* End of xtextdecode.c */