00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifdef HAVE_CONFIG_H
00024 # include "config.h"
00025 #endif
00026
00027
00028 #include "printer.h"
00029
00030
00031 #include <stdlib.h>
00032
00033
00034 #include <stdio.h>
00035
00036
00037 #include "validate.h"
00038
00039
00040
00041 static int
00042 comma_append (char **dst, const char *key, const char *value, int quotes)
00043 {
00044 char *tmp;
00045 int result;
00046
00047 if (*dst)
00048 if (value)
00049 if (quotes)
00050 result = asprintf (&tmp, "%s, %s=\"%s\"", *dst, key, value);
00051 else
00052 result = asprintf (&tmp, "%s, %s=%s", *dst, key, value);
00053 else
00054 result = asprintf (&tmp, "%s, %s", *dst, key);
00055 else if (value)
00056 if (quotes)
00057 result = asprintf (&tmp, "%s=\"%s\"", key, value);
00058 else
00059 result = asprintf (&tmp, "%s=%s", key, value);
00060 else
00061 result = asprintf (&tmp, "%s", key);
00062
00063 if (result < 0)
00064 return result;
00065
00066 free (*dst);
00067
00068 *dst = tmp;
00069
00070 return result;
00071 }
00072
00073 char *
00074 digest_md5_print_challenge (digest_md5_challenge * c)
00075 {
00076 char *out = NULL;
00077 size_t i;
00078
00079
00080
00081 if (digest_md5_validate_challenge (c) != 0)
00082 return NULL;
00083
00084 for (i = 0; i < c->nrealms; i++)
00085 {
00086 if (comma_append (&out, "realm", c->realms[i], 1) < 0)
00087 {
00088 free (out);
00089 return NULL;
00090 }
00091 }
00092
00093 if (c->nonce)
00094 if (comma_append (&out, "nonce", c->nonce, 1) < 0)
00095 {
00096 free (out);
00097 return NULL;
00098 }
00099
00100 if (c->qops)
00101 {
00102 char *tmp = NULL;
00103
00104 if (c->qops & DIGEST_MD5_QOP_AUTH)
00105 if (comma_append (&tmp, "auth", NULL, 0) < 0)
00106 {
00107 free (tmp);
00108 free (out);
00109 return NULL;
00110 }
00111
00112 if (c->qops & DIGEST_MD5_QOP_AUTH_INT)
00113 if (comma_append (&tmp, "auth-int", NULL, 0) < 0)
00114 {
00115 free (tmp);
00116 free (out);
00117 return NULL;
00118 }
00119
00120 if (c->qops & DIGEST_MD5_QOP_AUTH_CONF)
00121 if (comma_append (&tmp, "auth-conf", NULL, 0) < 0)
00122 {
00123 free (tmp);
00124 free (out);
00125 return NULL;
00126 }
00127
00128 if (comma_append (&out, "qop", tmp, 1) < 0)
00129 {
00130 free (tmp);
00131 free (out);
00132 return NULL;
00133 }
00134
00135 free (tmp);
00136 }
00137
00138 if (c->stale)
00139 if (comma_append (&out, "stale", "true", 0) < 0)
00140 {
00141 free (out);
00142 return NULL;
00143 }
00144
00145 if (c->servermaxbuf)
00146 {
00147 char *tmp;
00148
00149 if (asprintf (&tmp, "%lu", c->servermaxbuf) < 0)
00150 {
00151 free (out);
00152 return NULL;
00153 }
00154
00155 if (comma_append (&out, "maxbuf", tmp, 0) < 0)
00156 {
00157 free (out);
00158 return NULL;
00159 }
00160
00161 free (tmp);
00162 }
00163
00164 if (c->utf8)
00165 if (comma_append (&out, "charset", "utf-8", 0) < 0)
00166 {
00167 free (out);
00168 return NULL;
00169 }
00170
00171 if (comma_append (&out, "algorithm", "md5-sess", 0) < 0)
00172 {
00173 free (out);
00174 return NULL;
00175 }
00176
00177 if (c->ciphers)
00178 {
00179 char *tmp = NULL;
00180
00181 if (c->ciphers & DIGEST_MD5_CIPHER_3DES)
00182 if (comma_append (&tmp, "3des", NULL, 0) < 0)
00183 {
00184 free (tmp);
00185 free (out);
00186 return NULL;
00187 }
00188
00189 if (c->ciphers & DIGEST_MD5_CIPHER_DES)
00190 if (comma_append (&tmp, "des", NULL, 0) < 0)
00191 {
00192 free (tmp);
00193 free (out);
00194 return NULL;
00195 }
00196
00197 if (c->ciphers & DIGEST_MD5_CIPHER_RC4_40)
00198 if (comma_append (&tmp, "rc4-40", NULL, 0) < 0)
00199 {
00200 free (tmp);
00201 free (out);
00202 return NULL;
00203 }
00204
00205 if (c->ciphers & DIGEST_MD5_CIPHER_RC4)
00206 if (comma_append (&tmp, "rc4", NULL, 0) < 0)
00207 {
00208 free (tmp);
00209 free (out);
00210 return NULL;
00211 }
00212
00213 if (c->ciphers & DIGEST_MD5_CIPHER_RC4_56)
00214 if (comma_append (&tmp, "rc4-56", NULL, 0) < 0)
00215 {
00216 free (tmp);
00217 free (out);
00218 return NULL;
00219 }
00220
00221 if (c->ciphers & DIGEST_MD5_CIPHER_AES_CBC)
00222 if (comma_append (&tmp, "aes-cbc", NULL, 0) < 0)
00223 {
00224 free (tmp);
00225 free (out);
00226 return NULL;
00227 }
00228
00229 if (comma_append (&out, "cipher", tmp, 1) < 0)
00230 {
00231 free (tmp);
00232 free (out);
00233 return NULL;
00234 }
00235
00236 free (tmp);
00237 }
00238
00239 return out;
00240 }
00241
00242 char *
00243 digest_md5_print_response (digest_md5_response * r)
00244 {
00245 char *out = NULL;
00246 const char *qop = NULL;
00247 const char *cipher = NULL;
00248
00249
00250
00251 if (digest_md5_validate_response (r) != 0)
00252 return NULL;
00253
00254 if (r->qop & DIGEST_MD5_QOP_AUTH_CONF)
00255 qop = "qop=auth-conf";
00256 else if (r->qop & DIGEST_MD5_QOP_AUTH_INT)
00257 qop = "qop=auth-int";
00258 else if (r->qop & DIGEST_MD5_QOP_AUTH)
00259 qop = "qop=auth";
00260
00261 if (r->cipher & DIGEST_MD5_CIPHER_3DES)
00262 cipher = "cipher=3des";
00263 else if (r->cipher & DIGEST_MD5_CIPHER_DES)
00264 cipher = "cipher=des";
00265 else if (r->cipher & DIGEST_MD5_CIPHER_RC4_40)
00266 cipher = "cipher=rc4-40";
00267 else if (r->cipher & DIGEST_MD5_CIPHER_RC4)
00268 cipher = "cipher=rc4";
00269 else if (r->cipher & DIGEST_MD5_CIPHER_RC4_56)
00270 cipher = "cipher=rc4-56";
00271 else if (r->cipher & DIGEST_MD5_CIPHER_AES_CBC)
00272 cipher = "cipher=aes-cbc";
00273 else if (r->cipher & DIGEST_MD5_CIPHER_3DES)
00274 cipher = "cipher=3des";
00275
00276 if (r->username)
00277 if (comma_append (&out, "username", r->username, 1) < 0)
00278 {
00279 free (out);
00280 return NULL;
00281 }
00282
00283 if (r->realm)
00284 if (comma_append (&out, "realm", r->realm, 1) < 0)
00285 {
00286 free (out);
00287 return NULL;
00288 }
00289
00290 if (r->nonce)
00291 if (comma_append (&out, "nonce", r->nonce, 1) < 0)
00292 {
00293 free (out);
00294 return NULL;
00295 }
00296
00297 if (r->cnonce)
00298 if (comma_append (&out, "cnonce", r->cnonce, 1) < 0)
00299 {
00300 free (out);
00301 return NULL;
00302 }
00303
00304 if (r->nc)
00305 {
00306 char *tmp;
00307
00308 if (asprintf (&tmp, "%08lx", r->nc) < 0)
00309 {
00310 free (out);
00311 return NULL;
00312 }
00313
00314 if (comma_append (&out, "nc", tmp, 0) < 0)
00315 {
00316 free (tmp);
00317 free (out);
00318 return NULL;
00319 }
00320
00321 free (tmp);
00322 }
00323
00324 if (qop)
00325 if (comma_append (&out, qop, NULL, 0) < 0)
00326 {
00327 free (out);
00328 return NULL;
00329 }
00330
00331 if (r->digesturi)
00332 if (comma_append (&out, "digest-uri", r->digesturi, 1) < 0)
00333 {
00334 free (out);
00335 return NULL;
00336 }
00337
00338 if (r->response)
00339 if (comma_append (&out, "response", r->response, 0) < 0)
00340 {
00341 free (out);
00342 return NULL;
00343 }
00344
00345 if (r->clientmaxbuf)
00346 {
00347 char *tmp;
00348
00349 if (asprintf (&tmp, "%lu", r->clientmaxbuf) < 0)
00350 {
00351 free (out);
00352 return NULL;
00353 }
00354
00355 if (comma_append (&out, "maxbuf", tmp, 0) < 0)
00356 {
00357 free (tmp);
00358 free (out);
00359 return NULL;
00360 }
00361
00362 free (tmp);
00363 }
00364
00365 if (r->utf8)
00366 if (comma_append (&out, "charset", "utf-8", 0) < 0)
00367 {
00368 free (out);
00369 return NULL;
00370 }
00371
00372 if (cipher)
00373 if (comma_append (&out, cipher, NULL, 0) < 0)
00374 {
00375 free (out);
00376 return NULL;
00377 }
00378
00379 if (r->authzid)
00380 if (comma_append (&out, "authzid", r->authzid, 1) < 0)
00381 {
00382 free (out);
00383 return NULL;
00384 }
00385
00386 return out;
00387 }
00388
00389 char *
00390 digest_md5_print_finish (digest_md5_finish * finish)
00391 {
00392 char *out;
00393
00394
00395
00396 if (digest_md5_validate_finish (finish) != 0)
00397 return NULL;
00398
00399 if (asprintf (&out, "rspauth=%s", finish->rspauth) < 0)
00400 return NULL;
00401
00402 return out;
00403 }