You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2005/02/09 06:11:14 UTC
svn commit: r153017 - in
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos:
io/encoder/EncryptionTypeInfoEncoder.java
io/encoder/PreAuthenticationDataEncoder.java kdc/AuthenticationService.java
kdc/KdcErrorPreauthRequired.java messages/value/EncryptionTypeInfoEntry.java
Author: erodriguez
Date: Tue Feb 8 21:11:12 2005
New Revision: 153017
URL: http://svn.apache.org/viewcvs?view=rev&rev=153017
Log:
Updated the Kerberos protocol to return explanatory recovery information after a request failure. By default the Linux krb5 libs will not attempt pre-authentication until they receive a KRB_ERROR noting that pre-authentication is required as well as the preferred encryption types. Pre-authentication now works with Linux kerberos tools, console logins, and services such as SSHD. Tested on Fedora Core 2 and 3.
Added:
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/EncryptionTypeInfoEncoder.java
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/KdcErrorPreauthRequired.java
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/messages/value/EncryptionTypeInfoEntry.java
Modified:
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/PreAuthenticationDataEncoder.java
incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/AuthenticationService.java
Added: incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/EncryptionTypeInfoEncoder.java
URL: http://svn.apache.org/viewcvs/incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/EncryptionTypeInfoEncoder.java?view=auto&rev=153017
==============================================================================
--- incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/EncryptionTypeInfoEncoder.java (added)
+++ incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/EncryptionTypeInfoEncoder.java Tue Feb 8 21:11:12 2005
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.kerberos.io.encoder;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.apache.asn1.der.ASN1OutputStream;
+import org.apache.asn1.der.DERInteger;
+import org.apache.asn1.der.DEROctetString;
+import org.apache.asn1.der.DERSequence;
+import org.apache.asn1.der.DERTaggedObject;
+import org.apache.kerberos.messages.value.EncryptionTypeInfoEntry;
+
+
+public class EncryptionTypeInfoEncoder
+{
+ public static byte[] encode( EncryptionTypeInfoEntry[] entries )
+ throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ASN1OutputStream aos = new ASN1OutputStream( baos );
+ aos.writeObject( encodeSequence( entries ) );
+ aos.close();
+
+ return baos.toByteArray();
+ }
+
+ /**
+ * ETYPE-INFO ::= SEQUENCE OF ETYPE-INFO-ENTRY
+ */
+ protected static DERSequence encodeSequence( EncryptionTypeInfoEntry[] entries )
+ {
+ DERSequence sequence = new DERSequence();
+
+ for ( int ii = 0; ii < entries.length; ii++ )
+ {
+ sequence.add( encode( entries[ ii ] ) );
+ }
+
+ return sequence;
+ }
+
+ /**
+ * ETYPE-INFO-ENTRY ::= SEQUENCE {
+ * etype [0] Int32,
+ * salt [1] OCTET STRING OPTIONAL
+ * }
+ */
+ protected static DERSequence encode( EncryptionTypeInfoEntry entry )
+ {
+ DERSequence sequence = new DERSequence();
+
+ sequence.add( new DERTaggedObject( 0, DERInteger.valueOf( entry.getEncryptionType().getOrdinal() ) ) );
+
+ if ( entry.getSalt() != null )
+ {
+ sequence.add( new DERTaggedObject( 1, new DEROctetString( entry.getSalt() ) ) );
+ }
+
+ return sequence;
+ }
+}
+
Modified: incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/PreAuthenticationDataEncoder.java
URL: http://svn.apache.org/viewcvs/incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/PreAuthenticationDataEncoder.java?view=diff&r1=153016&r2=153017
==============================================================================
--- incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/PreAuthenticationDataEncoder.java (original)
+++ incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/io/encoder/PreAuthenticationDataEncoder.java Tue Feb 8 21:11:12 2005
@@ -30,29 +30,46 @@
public class PreAuthenticationDataEncoder
{
- public byte[] encode( PreAuthenticationData preAuth ) throws IOException
+ public static byte[] encode( PreAuthenticationData[] preAuth )
+ throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ASN1OutputStream aos = new ASN1OutputStream( baos );
- aos.writeObject( encodePreAuth( preAuth ) );
+ aos.writeObject( encodeSequence( preAuth ) );
aos.close();
return baos.toByteArray();
}
+ protected static DERSequence encodeSequence( PreAuthenticationData[] preAuth )
+ {
+ DERSequence sequence = new DERSequence();
+
+ for ( int ii = 0; ii < preAuth.length; ii++ )
+ {
+ sequence.add( encode( preAuth[ ii ] ) );
+ }
+
+ return sequence;
+ }
+
/**
* PA-DATA ::= SEQUENCE {
* padata-type[1] INTEGER,
* padata-value[2] OCTET STRING
* }
*/
- private DERSequence encodePreAuth( PreAuthenticationData preAuth )
+ protected static DERSequence encode( PreAuthenticationData preAuth )
{
DERSequence sequence = new DERSequence();
sequence.add( new DERTaggedObject( 1, DERInteger.valueOf( preAuth.getDataType().getOrdinal() ) ) );
- sequence.add( new DERTaggedObject( 2, new DEROctetString( preAuth.getDataValue() ) ) );
+
+ if ( preAuth.getDataValue() != null )
+ {
+ sequence.add( new DERTaggedObject( 2, new DEROctetString( preAuth.getDataValue() ) ) );
+ }
return sequence;
}
Modified: incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/AuthenticationService.java
URL: http://svn.apache.org/viewcvs/incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/AuthenticationService.java?view=diff&r1=153016&r2=153017
==============================================================================
--- incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/AuthenticationService.java (original)
+++ incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/AuthenticationService.java Tue Feb 8 21:11:12 2005
@@ -30,6 +30,8 @@
import org.apache.kerberos.io.decoder.EncryptedTimestampDecoder;
import org.apache.kerberos.io.encoder.EncAsRepPartEncoder;
import org.apache.kerberos.io.encoder.EncTicketPartEncoder;
+import org.apache.kerberos.io.encoder.EncryptionTypeInfoEncoder;
+import org.apache.kerberos.io.encoder.PreAuthenticationDataEncoder;
import org.apache.kerberos.kdc.store.PrincipalStore;
import org.apache.kerberos.kdc.store.PrincipalStoreEntry;
import org.apache.kerberos.messages.AuthenticationReply;
@@ -40,10 +42,12 @@
import org.apache.kerberos.messages.value.EncryptedData;
import org.apache.kerberos.messages.value.EncryptedTimeStamp;
import org.apache.kerberos.messages.value.EncryptionKey;
+import org.apache.kerberos.messages.value.EncryptionTypeInfoEntry;
import org.apache.kerberos.messages.value.KdcOptions;
import org.apache.kerberos.messages.value.KerberosTime;
import org.apache.kerberos.messages.value.LastRequest;
import org.apache.kerberos.messages.value.PreAuthenticationData;
+import org.apache.kerberos.messages.value.PreAuthenticationDataModifier;
import org.apache.kerberos.messages.value.PreAuthenticationDataType;
import org.apache.kerberos.messages.value.TicketFlags;
import org.apache.kerberos.messages.value.TransitedEncoding;
@@ -104,7 +108,7 @@
if ( preAuthData == null )
{
- throw KerberosException.KDC_ERR_PREAUTH_REQUIRED;
+ throw new KdcErrorPreauthRequired( preparePreAuthenticationError() );
}
EncryptedTimeStamp timestamp = null;
@@ -137,7 +141,7 @@
if ( timestamp == null )
{
- throw KerberosException.KDC_ERR_PREAUTH_REQUIRED;
+ throw new KdcErrorPreauthRequired( preparePreAuthenticationError() );
}
if ( !timestamp.getTimeStamp().isInClockSkew( config.getClockSkew() ) )
@@ -183,6 +187,48 @@
System.out.println( "Ticket will be issued to client " + clientPrincipal.toString() + "." );
return clientKey;
+ }
+
+ private byte[] preparePreAuthenticationError()
+ {
+ PreAuthenticationData[] paDataSequence = new PreAuthenticationData[ 2 ];
+
+ PreAuthenticationDataModifier modifier = new PreAuthenticationDataModifier();
+ modifier.setDataType( PreAuthenticationDataType.PA_ENC_TIMESTAMP );
+ modifier.setDataValue( new byte[ 0 ] );
+
+ paDataSequence[ 0 ] = modifier.getPreAuthenticationData();
+
+ EncryptionTypeInfoEntry[] entries = new EncryptionTypeInfoEntry[ 1 ];
+ entries[ 0 ] = new EncryptionTypeInfoEntry( EncryptionType.DES_CBC_MD5, null );
+
+ byte[] encTypeInfo = null;
+
+ try
+ {
+ encTypeInfo = EncryptionTypeInfoEncoder.encode( entries );
+ }
+ catch (IOException ioe)
+ {
+ ioe.printStackTrace();
+ return null;
+ }
+
+ PreAuthenticationDataModifier encTypeModifier = new PreAuthenticationDataModifier();
+ encTypeModifier.setDataType( PreAuthenticationDataType.PA_ENCTYPE_INFO );
+ encTypeModifier.setDataValue( encTypeInfo );
+
+ paDataSequence[ 1 ] = encTypeModifier.getPreAuthenticationData();
+
+ try
+ {
+ return PreAuthenticationDataEncoder.encode( paDataSequence );
+ }
+ catch (IOException ioe)
+ {
+ ioe.printStackTrace();
+ return null;
+ }
}
// TODO - client and server parameters; requires store
Added: incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/KdcErrorPreauthRequired.java
URL: http://svn.apache.org/viewcvs/incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/KdcErrorPreauthRequired.java?view=auto&rev=153017
==============================================================================
--- incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/KdcErrorPreauthRequired.java (added)
+++ incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/kdc/KdcErrorPreauthRequired.java Tue Feb 8 21:11:12 2005
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.kerberos.kdc;
+
+/**
+ * A Kerberos exception representing the requirement of pre-authentication by the client.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class KdcErrorPreauthRequired extends KerberosException
+{
+ /** the code associated with this protocol error */
+ public static final int CODE = 25;
+
+ /** the standard message associated with this protocol error */
+ public static final String MSG = "Additional pre-authentication required";
+
+
+ /**
+ * Creates an exception representing the requirement of pre-authentication by the client.
+ */
+ public KdcErrorPreauthRequired( byte[] explanatoryData )
+ {
+ super( CODE, MSG, explanatoryData );
+ }
+}
+
Added: incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/messages/value/EncryptionTypeInfoEntry.java
URL: http://svn.apache.org/viewcvs/incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/messages/value/EncryptionTypeInfoEntry.java?view=auto&rev=153017
==============================================================================
--- incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/messages/value/EncryptionTypeInfoEntry.java (added)
+++ incubator/directory/protocols/kerberos/trunk/core/src/java/org/apache/kerberos/messages/value/EncryptionTypeInfoEntry.java Tue Feb 8 21:11:12 2005
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.kerberos.messages.value;
+
+import org.apache.kerberos.crypto.encryption.EncryptionType;
+
+
+public class EncryptionTypeInfoEntry
+{
+ private EncryptionType encryptionType;
+ private byte[] salt;
+
+
+ public EncryptionTypeInfoEntry( EncryptionType encryptionType, byte[] salt )
+ {
+ this.encryptionType = encryptionType;
+ this.salt = salt;
+ }
+
+
+ public byte[] getSalt()
+ {
+ return salt;
+ }
+
+ public EncryptionType getEncryptionType()
+ {
+ return encryptionType;
+ }
+}
+