| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
 | 
 | 
package com.sun.security.sasl.gsskerb;  | 
 | 
 | 
 | 
import java.util.Map;  | 
 | 
import java.util.logging.Level;  | 
 | 
import javax.security.sasl.*;  | 
 | 
import com.sun.security.sasl.util.AbstractSaslImpl;  | 
 | 
import org.ietf.jgss.*;  | 
 | 
 | 
 | 
abstract class GssKrb5Base extends AbstractSaslImpl { | 
 | 
 | 
 | 
    private static final String KRB5_OID_STR = "1.2.840.113554.1.2.2";  | 
 | 
    protected static Oid KRB5_OID;  | 
 | 
    protected static final byte[] EMPTY = new byte[0];  | 
 | 
 | 
 | 
    static { | 
 | 
        try { | 
 | 
            KRB5_OID = new Oid(KRB5_OID_STR);  | 
 | 
        } catch (GSSException ignore) {} | 
 | 
    }  | 
 | 
 | 
 | 
    protected GSSContext secCtx = null;  | 
 | 
    protected static final int JGSS_QOP = 0;      | 
 | 
 | 
 | 
    protected GssKrb5Base(Map<String, ?> props, String className)  | 
 | 
        throws SaslException { | 
 | 
        super(props, className);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public String getMechanismName() { | 
 | 
        return "GSSAPI";  | 
 | 
    }  | 
 | 
 | 
 | 
    public byte[] unwrap(byte[] incoming, int start, int len)  | 
 | 
        throws SaslException { | 
 | 
        if (!completed) { | 
 | 
            throw new IllegalStateException("GSSAPI authentication not completed"); | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        if (!integrity) { | 
 | 
            throw new IllegalStateException("No security layer negotiated"); | 
 | 
        }  | 
 | 
 | 
 | 
        try { | 
 | 
            MessageProp msgProp = new MessageProp(JGSS_QOP, false);  | 
 | 
            byte[] answer = secCtx.unwrap(incoming, start, len, msgProp);  | 
 | 
            if (privacy && !msgProp.getPrivacy()) { | 
 | 
                throw new SaslException("Privacy not protected"); | 
 | 
            }  | 
 | 
            checkMessageProp("", msgProp); | 
 | 
            if (logger.isLoggable(Level.FINEST)) { | 
 | 
                traceOutput(myClassName, "KRB501:Unwrap", "incoming: ",  | 
 | 
                    incoming, start, len);  | 
 | 
                traceOutput(myClassName, "KRB502:Unwrap", "unwrapped: ",  | 
 | 
                    answer, 0, answer.length);  | 
 | 
            }  | 
 | 
            return answer;  | 
 | 
        } catch (GSSException e) { | 
 | 
            throw new SaslException("Problems unwrapping SASL buffer", e); | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public byte[] wrap(byte[] outgoing, int start, int len) throws SaslException { | 
 | 
        if (!completed) { | 
 | 
            throw new IllegalStateException("GSSAPI authentication not completed"); | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        if (!integrity) { | 
 | 
            throw new IllegalStateException("No security layer negotiated"); | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        try { | 
 | 
            MessageProp msgProp = new MessageProp(JGSS_QOP, privacy);  | 
 | 
            byte[] answer = secCtx.wrap(outgoing, start, len, msgProp);  | 
 | 
            if (logger.isLoggable(Level.FINEST)) { | 
 | 
                traceOutput(myClassName, "KRB503:Wrap", "outgoing: ",  | 
 | 
                    outgoing, start, len);  | 
 | 
                traceOutput(myClassName, "KRB504:Wrap", "wrapped: ",  | 
 | 
                    answer, 0, answer.length);  | 
 | 
            }  | 
 | 
            return answer;  | 
 | 
 | 
 | 
        } catch (GSSException e) { | 
 | 
            throw new SaslException("Problem performing GSS wrap", e); | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public void dispose() throws SaslException { | 
 | 
        if (secCtx != null) { | 
 | 
            try { | 
 | 
                secCtx.dispose();  | 
 | 
            } catch (GSSException e) { | 
 | 
                throw new SaslException("Problem disposing GSS context", e); | 
 | 
            }  | 
 | 
            secCtx = null;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void finalize() throws Throwable { | 
 | 
        dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
    void checkMessageProp(String label, MessageProp msgProp)  | 
 | 
            throws SaslException { | 
 | 
        if (msgProp.isDuplicateToken()) { | 
 | 
            throw new SaslException(label + "Duplicate token");  | 
 | 
        }  | 
 | 
        if (msgProp.isGapToken()) { | 
 | 
            throw new SaslException(label + "Gap token");  | 
 | 
        }  | 
 | 
        if (msgProp.isOldToken()) { | 
 | 
            throw new SaslException(label + "Old token");  | 
 | 
        }  | 
 | 
        if (msgProp.isUnseqToken()) { | 
 | 
            throw new SaslException(label + "Token not in sequence");  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |