Author: erodriguez
Date: Tue Nov  9 21:33:35 2004
New Revision: 57142

Modified:
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/changepw/ChangePasswordService.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KdcDispatcher.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KerberosService.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/TicketGrantingService.java
Log:
Moved authentication header verification and replay cache protection to service 
base class.

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/changepw/ChangePasswordService.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/changepw/ChangePasswordService.java
        (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/changepw/ChangePasswordService.java
        Tue Nov  9 21:33:35 2004
@@ -24,22 +24,20 @@
 import org.apache.kerberos.changepw.value.ChangePasswordData;
 import org.apache.kerberos.changepw.value.ChangePasswordDataModifier;
 import org.apache.kerberos.crypto.encryption.EncryptionEngine;
-import org.apache.kerberos.io.decoder.AuthenticatorDecoder;
 import org.apache.kerberos.io.decoder.EncKrbPrivPartDecoder;
-import org.apache.kerberos.io.decoder.EncTicketPartDecoder;
 import org.apache.kerberos.io.encoder.EncApRepPartEncoder;
 import org.apache.kerberos.io.encoder.EncKrbPrivPartEncoder;
 import org.apache.kerberos.kdc.KdcConfiguration;
 import org.apache.kerberos.kdc.KerberosException;
 import org.apache.kerberos.kdc.KerberosService;
 import org.apache.kerberos.kdc.store.PrincipalStore;
-import org.apache.kerberos.kdc.store.PrincipalStoreEntry;
 import org.apache.kerberos.messages.ApplicationRequest;
-import org.apache.kerberos.messages.MessageType;
 import org.apache.kerberos.messages.application.ApplicationReply;
 import org.apache.kerberos.messages.application.PrivateMessage;
 import org.apache.kerberos.messages.components.*;
-import org.apache.kerberos.messages.value.*;
+import org.apache.kerberos.messages.value.EncryptedData;
+import org.apache.kerberos.messages.value.EncryptionKey;
+import org.apache.kerberos.messages.value.HostAddress;
 
 import javax.security.auth.kerberos.KerberosKey;
 import javax.security.auth.kerberos.KerberosPrincipal;
@@ -49,10 +47,9 @@
 /**
  * Kerberos Change Password and Set Password Protocols (RFC 3244)
  */
-public class ChangePasswordService extends KerberosService {
-       
+public class ChangePasswordService extends KerberosService
+{
        private PasswordStore    store;
-       private PrincipalStore   bootstrap;
        private KdcConfiguration config;
        
        public ChangePasswordService(PasswordStore store, PrincipalStore 
bootstrap, KdcConfiguration config)
@@ -60,13 +57,12 @@
                super(config, bootstrap, null);
 
                this.store     = store;
-               this.bootstrap = bootstrap;
                this.config    = config;
        }
 
        public ChangePasswordReply getReplyFor(ChangePasswordRequest request)
-                       throws KerberosException, IOException {
-               
+                       throws KerberosException, IOException
+    {
                ApplicationRequest authHeader = request.getAuthHeader();
                
                Ticket ticket = authHeader.getTicket();
@@ -175,106 +171,6 @@
                replyModifier.setPrivateMessage(privateMessage);
                
                return replyModifier.getChangePasswordReply();
-               
-       }
-       
-       // TODO - this is a duplicate from the TGS service, with the 
ReplayCache disabled and ...
-       // TODO - ... changepw doesn't have the same LDAP store access
-       // RFC 1510 A.10.  KRB_AP_REQ verification
-       private Authenticator verifyAuthHeader(ApplicationRequest authHeader, 
Ticket ticket)
-                       throws KerberosException, IOException {
-               
-               if (authHeader.getProtocolVersionNumber() != 5)
-                       throw KerberosException.KRB_AP_ERR_BADVERSION;
-               if (authHeader.getMessageType() != MessageType.KRB_AP_REQ)
-                       throw KerberosException.KRB_AP_ERR_MSG_TYPE;
-               if (authHeader.getTicket().getTicketVersionNumber() != 5)
-                       throw KerberosException.KRB_AP_ERR_BADVERSION;
-               
-               EncryptionKey serverKey = null;
-               if (authHeader.getOption(ApOptions.USE_SESSION_KEY)) {
-                       serverKey = authHeader.getTicket().getSessionKey();
-               } else {
-                       KerberosPrincipal serverPrincipal = 
ticket.getServerPrincipal();
-                       PrincipalStoreEntry serverEntry = 
bootstrap.getEntry(serverPrincipal);
-                       
-                       if (serverEntry != null) {
-                               serverKey = serverEntry.getEncryptionKey();
-                       }/*
-                        else {
-                               serverKey = 
store.getEntry(serverPrincipal).getEncryptionKey();
-                       }
-                       */
-               }
-               if (serverKey == null) {
-                       // TODO - check server key version number, skvno; 
requires store
-                       if (false)
-                               throw KerberosException.KRB_AP_ERR_BADKEYVER;
-                       
-                       throw KerberosException.KRB_AP_ERR_NOKEY;
-               }
-               
-               try {
-            EncryptionEngine engine = getEncryptionEngine(serverKey);
-
-                       byte[] decTicketPart = 
engine.getDecryptedData(serverKey, ticket.getEncPart());
-
-                       EncTicketPartDecoder ticketPartDecoder = new 
EncTicketPartDecoder();
-                       EncTicketPart encPart = 
ticketPartDecoder.decode(decTicketPart);
-                       ticket.setEncTicketPart(encPart);
-               } catch (KerberosException ke) {
-                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
-               }
-               
-               Authenticator authenticator;
-               
-               try {
-            EncryptionEngine engine = 
getEncryptionEngine(ticket.getSessionKey());
-
-                       byte[] decAuthenticator = 
engine.getDecryptedData(ticket.getSessionKey(), authHeader.getEncPart());
-                       AuthenticatorDecoder authDecoder = new 
AuthenticatorDecoder();
-                       authenticator = authDecoder.decode(decAuthenticator);
-               } catch (KerberosException ke) {
-                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
-               }
-               
-               if 
(!authenticator.getClientPrincipal().getName().equals(ticket.getClientPrincipal().getName()))
 {
-                       throw KerberosException.KRB_AP_ERR_BADMATCH;
-               }
-               
-               // TODO - need to get at IP Address for sender
-               if (ticket.getClientAddresses() != null) {
-                       // if (sender_address(packet) is not in 
decr_ticket.caddr)
-            //    then error_out(KRB_AP_ERR_BADADDR);
-               }
-        else {
-               // if (application requires addresses) then
-            //    error_out(KRB_AP_ERR_BADADDR);
-        }
-               
-               /*
-               if(_replayCache.isReplay(authenticator.getClientTime(), 
authenticator.getClientPrincipal())) {
-                       throw KerberosException.KRB_AP_ERR_REPEAT;
-               }
-        
-               _replayCache.save(authenticator.getClientTime(), 
authenticator.getClientPrincipal());
-               */
-               
-               if 
(!authenticator.getClientTime().isInClockSkew(config.getClockSkew()))
-                       throw KerberosException.KRB_AP_ERR_SKEW;
-               
-               if (ticket.getStartTime() != null && 
!ticket.getStartTime().isInClockSkew(config.getClockSkew()) ||
-                               ticket.getFlag(TicketFlags.INVALID))
-                               // it hasn't yet become valid
-                throw KerberosException.KRB_AP_ERR_TKT_NYV;
-               
-               // TODO - doesn't take into account skew
-               if (!ticket.getEndTime().greaterThan(new KerberosTime()))
-            throw KerberosException.KRB_AP_ERR_TKT_EXPIRED;
-               
-               authHeader.setOption(ApOptions.MUTUAL_REQUIRED);
-               
-               return authenticator;
        }
 }
 

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KdcDispatcher.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KdcDispatcher.java
     (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KdcDispatcher.java
     Tue Nov  9 21:33:35 2004
@@ -19,8 +19,6 @@
 import org.apache.kerberos.io.decoder.KdcRequestDecoder;
 import org.apache.kerberos.io.encoder.ErrorMessageEncoder;
 import org.apache.kerberos.io.encoder.KdcReplyEncoder;
-import org.apache.kerberos.kdc.replay.InMemoryReplayCache;
-import org.apache.kerberos.kdc.replay.ReplayCache;
 import org.apache.kerberos.kdc.store.BootstrapStore;
 import org.apache.kerberos.kdc.store.PrincipalStore;
 import org.apache.kerberos.messages.AuthenticationReply;
@@ -39,10 +37,8 @@
        private static final byte TGS_REQ = (byte) 0x6C;
        private static final byte TGS_REP = (byte) 0x6D;
        
-       private ReplayCache _replay = new InMemoryReplayCache();
-       
-       private KdcRequestDecoder _decoder        = new KdcRequestDecoder();
-       private KdcReplyEncoder   _encoder        = new KdcReplyEncoder();
+       private KdcRequestDecoder   _decoder      = new KdcRequestDecoder();
+       private KdcReplyEncoder     _encoder      = new KdcReplyEncoder();
        private ErrorMessageEncoder _errorEncoder = new ErrorMessageEncoder();
        
        private PrincipalStore   _bootstrap;
@@ -60,7 +56,7 @@
                
                _errorService  = new ErrorService(_config);
                _authService   = new AuthenticationService(_store, _bootstrap, 
_config);
-               _tgsService    = new TicketGrantingService(_store, _bootstrap, 
_config, _replay);
+               _tgsService    = new TicketGrantingService(_store, _bootstrap, 
_config);
        }
        
        public byte[] dispatch(byte[] requestBytes) throws IOException {

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KerberosService.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KerberosService.java
   (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/KerberosService.java
   Tue Nov  9 21:33:35 2004
@@ -22,12 +22,24 @@
 import org.apache.kerberos.crypto.encryption.EncryptionType;
 import org.apache.kerberos.kdc.store.PrincipalStore;
 import org.apache.kerberos.kdc.store.PrincipalStoreEntry;
+import org.apache.kerberos.kdc.replay.ReplayCache;
+import org.apache.kerberos.kdc.replay.InMemoryReplayCache;
 import org.apache.kerberos.messages.components.Ticket;
+import org.apache.kerberos.messages.components.Authenticator;
+import org.apache.kerberos.messages.components.EncTicketPart;
 import org.apache.kerberos.messages.value.EncryptionKey;
+import org.apache.kerberos.messages.value.ApOptions;
+import org.apache.kerberos.messages.value.TicketFlags;
+import org.apache.kerberos.messages.value.KerberosTime;
+import org.apache.kerberos.messages.ApplicationRequest;
+import org.apache.kerberos.messages.MessageType;
+import org.apache.kerberos.io.decoder.EncTicketPartDecoder;
+import org.apache.kerberos.io.decoder.AuthenticatorDecoder;
 
 import javax.security.auth.kerberos.KerberosPrincipal;
 import java.util.HashMap;
 import java.util.Map;
+import java.io.IOException;
 
 public class KerberosService
 {
@@ -35,6 +47,8 @@
     private PrincipalStore   bootstrap;
     private PrincipalStore   store;
 
+    private ReplayCache replayCache = new InMemoryReplayCache();
+
     private Map checksumEngines = new HashMap();
 
     public KerberosService(KdcConfiguration config, PrincipalStore bootstrap, 
PrincipalStore store)
@@ -103,6 +117,100 @@
                if (!ticket.getRealm().equals(config.getPrimaryRealm())
                                && 
!ticket.getServerPrincipal().equals(serverPrincipal))
                        throw KerberosException.KRB_AP_ERR_NOT_US;
+       }
+
+    // RFC 1510 A.10.  KRB_AP_REQ verification
+       protected Authenticator verifyAuthHeader(ApplicationRequest authHeader, 
Ticket ticket)
+                       throws KerberosException, IOException {
+
+               if (authHeader.getProtocolVersionNumber() != 5)
+                       throw KerberosException.KRB_AP_ERR_BADVERSION;
+               if (authHeader.getMessageType() != MessageType.KRB_AP_REQ)
+                       throw KerberosException.KRB_AP_ERR_MSG_TYPE;
+               if (authHeader.getTicket().getTicketVersionNumber() != 5)
+                       throw KerberosException.KRB_AP_ERR_BADVERSION;
+
+        KerberosPrincipal serverPrincipal = ticket.getServerPrincipal();
+
+               EncryptionKey serverKey = null;
+
+               if (authHeader.getOption(ApOptions.USE_SESSION_KEY))
+        {
+                       serverKey = authHeader.getTicket().getSessionKey();
+               }
+        else
+        {
+                       serverKey = getKeyForPrincipal(serverPrincipal);
+               }
+
+               if (serverKey == null)
+        {
+                       // TODO - check server key version number, skvno; 
requires store
+                       if (false)
+                               throw KerberosException.KRB_AP_ERR_BADKEYVER;
+
+                       throw KerberosException.KRB_AP_ERR_NOKEY;
+               }
+
+               try {
+            EncryptionEngine engine = getEncryptionEngine(serverKey);
+
+                       byte[] decTicketPart = 
engine.getDecryptedData(serverKey, ticket.getEncPart());
+
+                       EncTicketPartDecoder ticketPartDecoder = new 
EncTicketPartDecoder();
+                       EncTicketPart encPart = 
ticketPartDecoder.decode(decTicketPart);
+                       ticket.setEncTicketPart(encPart);
+               } catch (KerberosException ke) {
+                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
+               }
+
+               Authenticator authenticator;
+
+               try {
+            EncryptionEngine engine = 
getEncryptionEngine(ticket.getSessionKey());
+
+                       byte[] decAuthenticator = 
engine.getDecryptedData(ticket.getSessionKey(), authHeader.getEncPart());
+                       AuthenticatorDecoder authDecoder = new 
AuthenticatorDecoder();
+                       authenticator = authDecoder.decode(decAuthenticator);
+               } catch (KerberosException ke) {
+                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
+               }
+
+               if 
(!authenticator.getClientPrincipal().getName().equals(ticket.getClientPrincipal().getName()))
 {
+                       throw KerberosException.KRB_AP_ERR_BADMATCH;
+               }
+
+               // TODO - need to get at IP Address for sender
+               if (ticket.getClientAddresses() != null) {
+                       // if (sender_address(packet) is not in 
decr_ticket.caddr)
+            //    then error_out(KRB_AP_ERR_BADADDR);
+               }
+        else {
+               // if (application requires addresses) then
+            //    error_out(KRB_AP_ERR_BADADDR);
+        }
+
+               if(replayCache.isReplay(authenticator.getClientTime(), 
authenticator.getClientPrincipal())) {
+                       throw KerberosException.KRB_AP_ERR_REPEAT;
+               }
+
+               replayCache.save(authenticator.getClientTime(), 
authenticator.getClientPrincipal());
+
+               if 
(!authenticator.getClientTime().isInClockSkew(config.getClockSkew()))
+                       throw KerberosException.KRB_AP_ERR_SKEW;
+
+               if (ticket.getStartTime() != null && 
!ticket.getStartTime().isInClockSkew(config.getClockSkew()) ||
+                               ticket.getFlag(TicketFlags.INVALID))
+                               // it hasn't yet become valid
+                throw KerberosException.KRB_AP_ERR_TKT_NYV;
+
+               // TODO - doesn't take into account skew
+               if (!ticket.getEndTime().greaterThan(new KerberosTime()))
+            throw KerberosException.KRB_AP_ERR_TKT_EXPIRED;
+
+               authHeader.setOption(ApOptions.MUTUAL_REQUIRED);
+
+               return authenticator;
        }
 }
 

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/TicketGrantingService.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/TicketGrantingService.java
     (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/kdc/TicketGrantingService.java
     Tue Nov  9 21:33:35 2004
@@ -22,17 +22,13 @@
 import org.apache.kerberos.crypto.encryption.EncryptionEngine;
 import org.apache.kerberos.crypto.encryption.EncryptionType;
 import org.apache.kerberos.io.decoder.ApplicationRequestDecoder;
-import org.apache.kerberos.io.decoder.AuthenticatorDecoder;
 import org.apache.kerberos.io.decoder.AuthorizationDataDecoder;
-import org.apache.kerberos.io.decoder.EncTicketPartDecoder;
 import org.apache.kerberos.io.encoder.EncTgsRepPartEncoder;
 import org.apache.kerberos.io.encoder.EncTicketPartEncoder;
 import org.apache.kerberos.io.encoder.KdcReqBodyEncoder;
-import org.apache.kerberos.kdc.replay.ReplayCache;
 import org.apache.kerberos.kdc.store.PrincipalStore;
 import org.apache.kerberos.messages.ApplicationRequest;
 import org.apache.kerberos.messages.KdcRequest;
-import org.apache.kerberos.messages.MessageType;
 import org.apache.kerberos.messages.TicketGrantReply;
 import org.apache.kerberos.messages.components.Authenticator;
 import org.apache.kerberos.messages.components.EncTicketPart;
@@ -52,15 +48,13 @@
 public class TicketGrantingService extends KerberosService {
        
        private KdcConfiguration config;
-       private ReplayCache      replayCache;
 
        public TicketGrantingService(PrincipalStore store, PrincipalStore 
bootstrap,
-                       KdcConfiguration config, ReplayCache replay)
+                       KdcConfiguration config)
     {
         super(config, bootstrap, store);
 
                this.config    = config;
-               replayCache    = replay;
        }
        
        public TicketGrantReply getReplyFor(KdcRequest request) throws 
KerberosException, IOException {
@@ -105,99 +99,7 @@
                return authHeader;
        }
        
-       // RFC 1510 A.10.  KRB_AP_REQ verification
-       private Authenticator verifyAuthHeader(ApplicationRequest authHeader, 
Ticket ticket)
-                       throws KerberosException, IOException {
-               
-               if (authHeader.getProtocolVersionNumber() != 5)
-                       throw KerberosException.KRB_AP_ERR_BADVERSION;
-               if (authHeader.getMessageType() != MessageType.KRB_AP_REQ)
-                       throw KerberosException.KRB_AP_ERR_MSG_TYPE;
-               if (authHeader.getTicket().getTicketVersionNumber() != 5)
-                       throw KerberosException.KRB_AP_ERR_BADVERSION;
 
-        KerberosPrincipal serverPrincipal = ticket.getServerPrincipal();
-
-               EncryptionKey serverKey = null;
-
-               if (authHeader.getOption(ApOptions.USE_SESSION_KEY))
-        {
-                       serverKey = authHeader.getTicket().getSessionKey();
-               }
-        else
-        {
-                       serverKey = getKeyForPrincipal(serverPrincipal);
-               }
-
-               if (serverKey == null)
-        {
-                       // TODO - check server key version number, skvno; 
requires store
-                       if (false)
-                               throw KerberosException.KRB_AP_ERR_BADKEYVER;
-                       
-                       throw KerberosException.KRB_AP_ERR_NOKEY;
-               }
-               
-               try {
-            EncryptionEngine engine = getEncryptionEngine(serverKey);
-
-                       byte[] decTicketPart = 
engine.getDecryptedData(serverKey, ticket.getEncPart());
-
-                       EncTicketPartDecoder ticketPartDecoder = new 
EncTicketPartDecoder();
-                       EncTicketPart encPart = 
ticketPartDecoder.decode(decTicketPart);
-                       ticket.setEncTicketPart(encPart);
-               } catch (KerberosException ke) {
-                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
-               }
-               
-               Authenticator authenticator;
-               
-               try {
-            EncryptionEngine engine = 
getEncryptionEngine(ticket.getSessionKey());
-
-                       byte[] decAuthenticator = 
engine.getDecryptedData(ticket.getSessionKey(), authHeader.getEncPart());
-                       AuthenticatorDecoder authDecoder = new 
AuthenticatorDecoder();
-                       authenticator = authDecoder.decode(decAuthenticator);
-               } catch (KerberosException ke) {
-                       throw KerberosException.KRB_AP_ERR_BAD_INTEGRITY;
-               }
-               
-               if 
(!authenticator.getClientPrincipal().getName().equals(ticket.getClientPrincipal().getName()))
 {
-                       throw KerberosException.KRB_AP_ERR_BADMATCH;
-               }
-               
-               // TODO - need to get at IP Address for sender
-               if (ticket.getClientAddresses() != null) {
-                       // if (sender_address(packet) is not in 
decr_ticket.caddr)
-            //    then error_out(KRB_AP_ERR_BADADDR);
-               }
-        else {
-               // if (application requires addresses) then
-            //    error_out(KRB_AP_ERR_BADADDR);
-        }
-               
-               if(replayCache.isReplay(authenticator.getClientTime(), 
authenticator.getClientPrincipal())) {
-                       throw KerberosException.KRB_AP_ERR_REPEAT;
-               }
-        
-               replayCache.save(authenticator.getClientTime(), 
authenticator.getClientPrincipal());
-               
-               if 
(!authenticator.getClientTime().isInClockSkew(config.getClockSkew()))
-                       throw KerberosException.KRB_AP_ERR_SKEW;
-               
-               if (ticket.getStartTime() != null && 
!ticket.getStartTime().isInClockSkew(config.getClockSkew()) ||
-                               ticket.getFlag(TicketFlags.INVALID))
-                               // it hasn't yet become valid
-                throw KerberosException.KRB_AP_ERR_TKT_NYV;
-               
-               // TODO - doesn't take into account skew
-               if (!ticket.getEndTime().greaterThan(new KerberosTime()))
-            throw KerberosException.KRB_AP_ERR_TKT_EXPIRED;
-               
-               authHeader.setOption(ApOptions.MUTUAL_REQUIRED);
-               
-               return authenticator;
-       }
        
        // TODO - configurable checksum
        private void verifyBodyChecksum(Checksum authChecksum, KdcRequest 
request)

Reply via email to