public void authenticate(AuthenticationProtocolClient authenticationprotocolclient, String s) throws IOException, TerminatedStateException { try { logger.finest("Registering gss-ssh return messages."); authenticationprotocolclient.registerMessage( com.sshtools.j2ssh.authentication.SshMsgUserauthGssapiResponse.class, 60); authenticationprotocolclient.registerMessage( com.sshtools.j2ssh.authentication.SshMsgUserauthGssapiToken.class, 61); authenticationprotocolclient.registerMessage( com.sshtools.j2ssh.authentication.SshMsgUserauthGssapiError.class, 64); authenticationprotocolclient.registerMessage( com.sshtools.j2ssh.authentication.SshMsgUserauthGssapiErrtok.class, 65); logger.finest("Sending gssapi user auth request."); ByteArrayWriter bytearraywriter = new ByteArrayWriter(); bytearraywriter.writeUINT32(new UnsignedInteger32(1L)); byte abyte0[] = GSSConstants.MECH_OID.getDER(); bytearraywriter.writeBinaryString(abyte0); logger.finest("Username:"******"gssapi", bytearraywriter.toByteArray()); authenticationprotocolclient.sendMessage(sshmsguserauthrequest); logger.finest("Receiving user auth response:"); SshMsgUserauthGssapiResponse sshmsguserauthgssapiresponse = (SshMsgUserauthGssapiResponse) authenticationprotocolclient.readMessage(60); ByteArrayReader bytearrayreader = new ByteArrayReader(sshmsguserauthgssapiresponse.getRequestData()); byte abyte1[] = bytearrayreader.readBinaryString(); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "Mechanism requested: " + GSSConstants.MECH_OID); logger.log(Level.FINEST, "Mechanism selected: " + new Oid(abyte1)); logger.log(Level.FINEST, "Verify that selected mechanism is GSSAPI."); } if (!GSSConstants.MECH_OID.equals(new Oid(abyte1))) { logger.warning("Mechanism do not match!"); throw new IOException("Mechanism do not match!"); } logger.finest("Creating GSS context base on grid credentials."); GlobusGSSManagerImpl globusgssmanagerimpl = new GlobusGSSManagerImpl(); HostAuthorization gssAuth = new HostAuthorization(null); GSSName targetName = gssAuth.getExpectedName(null, hostname); GSSContext gsscontext = globusgssmanagerimpl.createContext( targetName, new Oid(abyte1), gsscredential, GSSCredential.INDEFINITE_LIFETIME - 1); gsscontext.requestCredDeleg(true); gsscontext.requestMutualAuth(true); gsscontext.requestReplayDet(true); gsscontext.requestSequenceDet(true); // MOD // gsscontext.requestConf(false); gsscontext.requestConf(true); Object type = GSIConstants.DELEGATION_TYPE_LIMITED; gsscontext.requestCredDeleg(false); ((ExtendedGSSContext) gsscontext).setOption(GSSConstants.DELEGATION_TYPE, type); logger.finest("Starting GSS token exchange."); byte abyte2[] = new byte[0]; do { if (gsscontext.isEstablished()) break; byte abyte3[] = gsscontext.initSecContext(abyte2, 0, abyte2.length); if (abyte3 != null) { ByteArrayWriter bytearraywriter1 = new ByteArrayWriter(); bytearraywriter1.writeBinaryString(abyte3); SshMsgUserauthGssapiToken sshmsguserauthgssapitoken = new SshMsgUserauthGssapiToken(bytearraywriter1.toByteArray()); authenticationprotocolclient.sendMessage(sshmsguserauthgssapitoken); } if (!gsscontext.isEstablished()) { SshMsgUserauthGssapiToken sshmsguserauthgssapitoken1 = (SshMsgUserauthGssapiToken) authenticationprotocolclient.readMessage(61); ByteArrayReader bytearrayreader1 = new ByteArrayReader(sshmsguserauthgssapitoken1.getRequestData()); abyte2 = bytearrayreader1.readBinaryString(); } } while (true); logger.log(Level.FINEST, "Sending gssapi exchange complete."); SshMsgUserauthGssapiExchangeComplete sshmsguserauthgssapiexchangecomplete = new SshMsgUserauthGssapiExchangeComplete(); authenticationprotocolclient.sendMessage(sshmsguserauthgssapiexchangecomplete); if (logger.isLoggable(Level.FINEST)) { logger.log( Level.FINEST, "Context established.\nInitiator : " + gsscontext.getSrcName() + "\nAcceptor : " + gsscontext.getTargName() + "\nLifetime : " + gsscontext.getLifetime() + "\nIntegrity : " + gsscontext.getIntegState() + "\nConfidentiality : " + gsscontext.getConfState() + "\nAnonymity : " + gsscontext.getAnonymityState()); } } catch (Throwable t) { logger.log(Level.WARNING, "Got Exception: ", t); throw new TerminatedStateException(AuthenticationProtocolState.FAILED); } }
/** * Encodes the authentication packet for supported authentication methods. * * @param request the socks proxy request data * @return the encoded buffer * @throws GSSException when something fails while using GSSAPI */ private IoBuffer encodeGSSAPIAuthenticationPacket(final SocksProxyRequest request) throws GSSException { GSSContext ctx = (GSSContext) getSession().getAttribute(GSS_CONTEXT); if (ctx == null) { // first step in the authentication process GSSManager manager = GSSManager.getInstance(); GSSName serverName = manager.createName(request.getServiceKerberosName(), null); Oid krb5OID = new Oid(SocksProxyConstants.KERBEROS_V5_OID); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Available mechs:"); for (Oid o : manager.getMechs()) { if (o.equals(krb5OID)) { LOGGER.debug("Found Kerberos V OID available"); } LOGGER.debug("{} with oid = {}", manager.getNamesForMech(o), o); } } ctx = manager.createContext(serverName, krb5OID, null, GSSContext.DEFAULT_LIFETIME); ctx.requestMutualAuth(true); // Mutual authentication ctx.requestConf(false); ctx.requestInteg(false); getSession().setAttribute(GSS_CONTEXT, ctx); } byte[] token = (byte[]) getSession().getAttribute(GSS_TOKEN); if (token != null) { LOGGER.debug(" Received Token[{}] = {}", token.length, ByteUtilities.asHex(token)); } IoBuffer buf = null; if (!ctx.isEstablished()) { // token is ignored on the first call if (token == null) { token = new byte[32]; } token = ctx.initSecContext(token, 0, token.length); // Send a token to the server if one was generated by // initSecContext if (token != null) { LOGGER.debug(" Sending Token[{}] = {}", token.length, ByteUtilities.asHex(token)); getSession().setAttribute(GSS_TOKEN, token); buf = IoBuffer.allocate(4 + token.length); buf.put( new byte[] { SocksProxyConstants.GSSAPI_AUTH_SUBNEGOTIATION_VERSION, SocksProxyConstants.GSSAPI_MSG_TYPE }); buf.put(ByteUtilities.intToNetworkByteOrder(token.length, 2)); buf.put(token); } } return buf; }