A fundamental JGSS-API bug?

Sean Mullan sean.mullan at oracle.com
Fri Jun 7 08:49:12 PDT 2013


On 06/07/2013 09:42 AM, Weijun Wang wrote:
> Hi All
>
> The GSSContext::initSecContext() method could either return a token
> (possibly null if no more token is needed) when the call succeeds or
> throw a GSSException if there is a failure, but not *both*. The same
> applies to acceptSecContext().
>
> However, according to RFC 2743 2.2.1 [1], the C bindings of GSS-API:
>
>     It is the caller's responsibility to establish a communications path
>     to the target, and to transmit any returned output_token (independent
>     of the accompanying returned major_status value) to the target over
>     that path.
>
> In fact, MIT krb5's gss-client.c sample does show:
>
>          do {
>              maj_stat = gss_init_sec_context(..., &send_tok, ...);
>              ...
>              if (send_tok.length != 0) {    # send the token anyway
>                  if (send_token(..., &send_tok) < 0) {
>                      ...
>                      return -1;
>                  }
>              }                              # before return value check
>              if (maj_stat != GSS_S_COMPLETE
>                  && maj_stat != GSS_S_CONTINUE_NEEDED) {
>                  ...
>                  return -1;
>              }
>
>              if (maj_stat == GSS_S_CONTINUE_NEEDED) {
>                  ...
>              }
>          } while (maj_stat == GSS_S_CONTINUE_NEEDED);
>
> Without the ability to send a token when there is a failure, a Java
> program has no chance to tell the other side what's happening. This is
> very user-unfriendly. Also, in the case of SPNEGO, a "reject"
> NegTokenResp token will never be able to sent.
>
> I cannot find a good way to fix it without changing the semantic of
> current APIs. Maybe we can add a new GSSException::getResidue() method
> to return this last token. But that means the method call will be quite
> complicated, something like
>
>          try {
>              send(initSecContext(inToken));
>          } catch (GSSException e) {
>              if (e.getResidue() != null) {
>                  send(e.getResidue());
>              }
>              throw e;
>          }

That doesn't seem too complicated to me, all things considered. I think 
this would be a reasonable solution. I would simply name the method 
getToken instead of getResidue.

> As for the overloaded initSecContext(InputStream, OutputStream) style,
> it looks easier to update this method to do the correct thing without
> any new API. However, the change will be very confusing because there is
> no more number of written bytes to return. More importantly, if it's
> just a silent behavior change, we'll have to care about compatibility
> (Maybe someone already added his/her own KRB-ERROR sending codes?),
> which makes the situation much tougher.

Can you describe how the application code would use this method like you 
did above for the other initSecContext method?

--Sean

>
> Thanks
> Max
>
> [1] http://tools.ietf.org/html/rfc2743#page-46



More information about the security-dev mailing list