* Parse a digest parameter */
| 160 | * Parse a digest parameter |
| 161 | */ |
| 162 | static inline int parse_digest_param(str* _s, dig_cred_t* _c) |
| 163 | { |
| 164 | dig_par_t t; |
| 165 | str* ptr; |
| 166 | str dummy; |
| 167 | |
| 168 | /* Get type of the parameter */ |
| 169 | if (parse_param_name(_s, &t) < 0) { |
| 170 | return -1; |
| 171 | } |
| 172 | |
| 173 | _s->s++; /* skip = */ |
| 174 | _s->len--; |
| 175 | |
| 176 | /* Find the beginning of body */ |
| 177 | trim_leading(_s); |
| 178 | |
| 179 | if (_s->len == 0) { |
| 180 | return -2; |
| 181 | } |
| 182 | |
| 183 | /* Decide in which attribute the |
| 184 | * body content will be stored |
| 185 | */ |
| 186 | switch(t) { |
| 187 | case PAR_USERNAME: ptr = &_c->username.whole; break; |
| 188 | case PAR_REALM: ptr = &_c->realm; break; |
| 189 | case PAR_NONCE: ptr = &_c->nonce; break; |
| 190 | case PAR_URI: ptr = &_c->uri; break; |
| 191 | case PAR_RESPONSE: ptr = &_c->response; break; |
| 192 | case PAR_CNONCE: ptr = &_c->cnonce; break; |
| 193 | case PAR_OPAQUE: ptr = &_c->opaque; break; |
| 194 | case PAR_QOP: ptr = &_c->qop.qop_str; break; |
| 195 | case PAR_NC: ptr = &_c->nc; break; |
| 196 | case PAR_ALGORITHM: ptr = &_c->alg.alg_str; break; |
| 197 | case PAR_AUTS: ptr = &_c->auts; break; |
| 198 | case PAR_OTHER: ptr = &dummy; break; |
| 199 | default: ptr = &dummy; break; |
| 200 | } |
| 201 | |
| 202 | /* If the first character is quote, it is |
| 203 | * a quoted string, otherwise it is a token |
| 204 | */ |
| 205 | if (_s->s[0] == '\"') { |
| 206 | if (parse_quoted(_s, ptr) < 0) { |
| 207 | return -3; |
| 208 | } |
| 209 | } else { |
| 210 | if (parse_token(_s, ptr) < 0) { |
| 211 | return -4; |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | return 0; |
| 216 | } |
| 217 | |
| 218 | |
| 219 | /* |
no test coverage detected