diff --git a/lib/gssapi/gss-token.1 b/lib/gssapi/gss-token.1 index 7e16af0ac..e4e25f5c6 100644 --- a/lib/gssapi/gss-token.1 +++ b/lib/gssapi/gss-token.1 @@ -15,6 +15,7 @@ .Fl r .Op Fl MNln .Op Fl C Ar ccache +.Op Fl S Ar maxsize .Op Fl c count .Op Ar service@host .Sh DESCRIPTION @@ -52,6 +53,11 @@ This can be used to load test the KDC. prepend .Dq Negotiate\ to generated tokens and expect it on consumed tokens. +.It Fl S Ar maxsize +split each token that is generated into components of maximum +size +.Ar maxsize . +Each token is base64 encoded and output separately. .It Fl c Ar count repeat the operation .Ar count diff --git a/lib/gssapi/gss-token.c b/lib/gssapi/gss-token.c index ee4ad7e92..185115320 100644 --- a/lib/gssapi/gss-token.c +++ b/lib/gssapi/gss-token.c @@ -89,6 +89,7 @@ * global variables */ +int Sflag = 0; int nflag = 0; static char * @@ -207,18 +208,35 @@ write_token(gss_buffer_t out, int negotiate) char *outstr = NULL; char *p = out->value; size_t len = out->length; + size_t inc; int ret; + int first = 1; if (nflag) return 0; - ret = rk_base64_encode(p, len, &outstr); - if (ret < 0) { - fprintf(stderr, "Out of memory.\n"); - return 1; - } - printf("%s%s\n", negotiate?"Negotiate ":"", outstr); - free(outstr); + inc = len; + if (Sflag) + inc = Sflag; + + do { + if (first) + first = 0; + else + printf("\n"); + if (len < inc) + inc = len; + ret = rk_base64_encode(p, inc, &outstr); + if (ret < 0) { + fprintf(stderr, "Out of memory.\n"); + return 1; + } + printf("%s%s\n", negotiate?"Negotiate ":"", outstr); + free(outstr); + p += inc; + len -= inc; + } while (len > 0); + return 0; } @@ -528,6 +546,7 @@ main(int argc, char **argv) { NULL, 'D', arg_flag, &Dflag, NULL, NULL }, { NULL, 'M', arg_flag, &Mflag, NULL, NULL }, { NULL, 'N', arg_flag, &Nflag, NULL, NULL }, + { NULL, 'S', arg_integer, &Sflag, NULL, NULL }, { NULL, 'c', arg_integer, &count, NULL, NULL }, { NULL, 'l', arg_flag, &lflag, NULL, NULL }, { NULL, 'n', arg_flag, &nflag, NULL, NULL },