Branch data Line data Source code
1 : : /* qop.c --- DIGEST-MD5 QOP handling.
2 : : * Copyright (C) 2002-2012 Simon Josefsson
3 : : *
4 : : * This file is part of GNU SASL Library.
5 : : *
6 : : * GNU SASL Library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public License
8 : : * as published by the Free Software Foundation; either version 2.1 of
9 : : * the License, or (at your option) any later version.
10 : : *
11 : : * GNU SASL Library is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License along with GNU SASL Library; if not, write to the Free
18 : : * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 : : * Boston, MA 02110-1301, USA.
20 : : *
21 : : */
22 : :
23 : : #ifdef HAVE_CONFIG_H
24 : : #include "config.h"
25 : : #endif
26 : :
27 : : /* Get prototypes. */
28 : : #include "qop.h"
29 : :
30 : : #include "tokens.h"
31 : : #include "parser.h"
32 : :
33 : : #include <string.h>
34 : : #include <stdlib.h>
35 : :
36 : : int
37 : 11 : digest_md5_qopstr2qops (const char *qopstr)
38 : : {
39 : 11 : int qops = 0;
40 : : enum
41 : : {
42 : : /* the order must match the following struct */
43 : : QOP_AUTH = 0,
44 : : QOP_AUTH_INT,
45 : : QOP_AUTH_CONF
46 : : };
47 : 11 : const char *const qop_opts[] = {
48 : : /* the order must match the previous enum */
49 : : "qop-auth",
50 : : "qop-int",
51 : : "qop-conf",
52 : : NULL
53 : : };
54 : : char *subsubopts;
55 : : char *val;
56 : : char *qopdup;
57 : :
58 [ - + ]: 11 : if (!qopstr)
59 : 0 : return 0;
60 : :
61 : 11 : qopdup = strdup (qopstr);
62 [ - + ]: 11 : if (!qopdup)
63 : 0 : return -1;
64 : :
65 : 11 : subsubopts = qopdup;
66 [ + + ]: 23 : while (*subsubopts != '\0')
67 [ + + - - ]: 12 : switch (digest_md5_getsubopt (&subsubopts, qop_opts, &val))
68 : : {
69 : : case QOP_AUTH:
70 : 9 : qops |= DIGEST_MD5_QOP_AUTH;
71 : 9 : break;
72 : :
73 : : case QOP_AUTH_INT:
74 : 3 : qops |= DIGEST_MD5_QOP_AUTH_INT;
75 : 3 : break;
76 : :
77 : : case QOP_AUTH_CONF:
78 : 0 : qops |= DIGEST_MD5_QOP_AUTH_CONF;
79 : 0 : break;
80 : :
81 : : default:
82 : : /* ignore unrecognized options */
83 : 0 : break;
84 : : }
85 : :
86 : 11 : free (qopdup);
87 : :
88 : 11 : return qops;
89 : : }
90 : :
91 : : const char *
92 : 20 : digest_md5_qops2qopstr (int qops)
93 : : {
94 : 20 : const char *qopstr[] = {
95 : : /* 0 */ "qop-auth",
96 : : /* 1 */ "qop-auth",
97 : : /* 2 */ "qop-int",
98 : : /* 3 */ "qop-auth, qop-int",
99 : : /* 4 */ "qop-conf",
100 : : /* 5 */ "qop-auth, qop-conf",
101 : : /* 6 */ "qop-int, qop-conf",
102 : : /* 7 */ "qop-auth, qop-int, qop-conf"
103 : : };
104 : :
105 : 20 : return qopstr[qops & 0x07];
106 : : }
|