MWChapel wrote:
Hello,

I am working on figuring a solution to the Java conundrum that was
stated in an earlier thread last month i.e.:


Sun's implementation of Java GSS/Kerberos currently supports
PA-ENC-TIMESTAMP as per RFC 1510. The new pre-authentication types
specified in the Kerberos clarifications provide additional
pre-authentication. Support for these new pre-authentication types
PA-ETYPE-INFO and PA-ETYPE-INFO2 will be available in future J2SE

release.

Yes it appears the PA-ENC-TIMESTAMP works, if it is encrypted using the
correct key. But if the salt or what 1510 referees to as an
'alternate "mix-in" string' is wrong the KDC returns with a error 24,
rather then a 25.

RFC 1510 does refer to the pa-pw-salt as a returned PA-DATA. Java
does not handle this in the 24 error. Although it is underspecified,
one could argue the Java implementation is not 1510 compliant.

Comments on the Kerberos mailing list from others indicate that the
Java
code is not handling pre-auth correctly.


However, if you specify the etype correctly, you should not get the
pre-authentication error. You can specify the default encryption

types

used by the Java client in the Kerberos configuration file.



Its not an e-type problem, it is a wrong salt or failure of the client
to use the salt returned by the KDC.

You can easily test this with a network trace program, like Ethereal
and
use the Java kinit against a Windows AD. Just change the case of one
of the letters in the principal name, and you will get a KRB5_ERROR
response with (24). If you look at the message you will see the salt
returned twice, as a PA-ETYPE-INFO and PA-SALT-DATA. (Ethereal has some
problems parsing these, but the salt is in the message.)


I am responsible for the IBM Java Kerberos piece, and am trying to work out a solution.

Here is the problem. Java kerberos always sends the pa-enc-timestamp,
but since windows 2003 is using mixed case names, then the salt will be
incorrect.

The first problem is Java is sending the pa-enc-timestamp with the first request. If it did not then you would get the (25) response. I think that is the real solution.

The pseudo code on page 92 says:

 if(client.pa_enc_timestamp_required and
           pa_enc_timestamp not present) then
                error_out(KDC_ERR_PREAUTH_REQUIRED(PA_ENC_TIMESTAMP));
        endif

        if(pa_enc_timestamp present) then
                decrypt req.padata-value into decrypted_enc_timestamp
                        using client.key;
                        using auth_hdr.authenticator.subkey;
                if (decrypt_error()) then
                        error_out(KRB_AP_ERR_BAD_INTEGRITY);
                if(decrypted_enc_timestamp is not within allowable
                        skew) then error_out(KDC_ERR_PREAUTH_FAILED);
                endif
                if(decrypted_enc_timestamp and usec is replay)
                        error_out(KDC_ERR_PREAUTH_FAILED);
                endif
                add decrypted_enc_timestamp and usec to replay cache;
        endif
If you did not send the pa_enc_type and it is needed you get a 25.
If you sent the pa_enc_timestamp, and it is wrong, then you get a 24.

3.1.3 says also says:

   The authentication server looks up the client and server principals
   named in the KRB_AS_REQ in its database, extracting their respective
   keys.  If required, the server pre-authenticates the request, and if
   the pre-authentication check fails, an error message with the code
   KDC_ERR_PREAUTH_FAILED is returned.

(BTW if the account was renamed, the principal name could change,
but not the salt, so it is not just mixed case problem.)

which it fails, and since the pa-enc-timestamp is included,
windows should throw a KDC_ERR_PREAUTH_FAILED(24) as per rfc1510. But
the previous note is stating that we aren't handling the error 24. That
is where I tend to disagree, with the KDC_ERR_PREAUTH_FAILED there will
be no e-data provided as stated in rfc1510.

OK, I will agree with that, some KDCs may send extra data with 24 but not all.

What we need is a
KDC_ERR_PREAUTH_REQUIRED(25) with the e-data in the KRB_ERROR. Am I
right in assuming that?

If the first request sent in did NOT have the pa-enc-timestamp, then that this is the response you would receive.


If so since I already send the as-req
automatically with the pa-enc-timestamp, if I get the
KDC_ERR_PREAUTH_REQUIRED,

But the KDC is not keeping state. Since you sent in a req with pre-auth it is assuming it had already sent you a 25 in the previous response and that you did all the right things with extra data in the 25 error response. So it sends a 24, in which case you can't do anything else.

should I be required to read the e-data
method-data as the new salt to encypt with?

In a 25 yes.


The problem arises is that I have the pa-enc-timestamp in the as-req, and as per rfc1510, they should be sending a KDC_ERR_PREAUTH_FAILED error if present but failed, and not KDC_ERR_PREAUTH_REQUIRED. So how is it with the mixed case names can this be handled?


Don't send any pre-auth in the first request.

Sorry to open this can of worms again. But I am trying to work a
solution on the Java side of the arguement.

Thanks.

Michael W. Chapel
[EMAIL PROTECTED]
Java Kerberos/JGSS Development
IBM/Tivoli Java Security Austin Texas


________________________________________________
Kerberos mailing list           Kerberos@mit.edu
https://mailman.mit.edu/mailman/listinfo/kerberos




--

 Douglas E. Engert  <[EMAIL PROTECTED]>
 Argonne National Laboratory
 9700 South Cass Avenue
 Argonne, Illinois  60439
 (630) 252-5444
________________________________________________
Kerberos mailing list           Kerberos@mit.edu
https://mailman.mit.edu/mailman/listinfo/kerberos

Reply via email to