Index: src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSManagerImplTest.java =================================================================== --- src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSManagerImplTest.java (revision 0) +++ src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSManagerImplTest.java (revision 0) @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.tests.jgss; + +import java.util.Arrays; + +import org.apache.harmony.auth.jgss.kerberos.KerberosUtils; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +import junit.framework.TestCase; + +public class GSSManagerImplTest extends TestCase { + + private GSSManager gssManager; + + public void testGetMechs() throws Exception{ + Oid[] mechs = gssManager.getMechs(); + Oid kerberosMech = new Oid("1.2.840.113554.1.2.2"); + Oid[] expectedMechs = new Oid[]{kerberosMech}; + assertTrue(Arrays.equals(expectedMechs, mechs)); + } + + public void testGetMechsForName() throws Exception { + Oid nameType = GSSName.NT_ANONYMOUS; + Oid[] mechs = gssManager.getMechsForName(nameType); + assertEquals(0, mechs.length); + + nameType = GSSName.NT_MACHINE_UID_NAME; + mechs = gssManager.getMechsForName(nameType); + assertEquals(0, mechs.length); + + nameType = GSSName.NT_STRING_UID_NAME; + mechs = gssManager.getMechsForName(nameType); + assertEquals(0, mechs.length); + + nameType = GSSName.NT_USER_NAME; + mechs = gssManager.getMechsForName(nameType); + Oid kerberosMech = new Oid("1.2.840.113554.1.2.2"); + Oid[] expectedMechs = new Oid[] { kerberosMech }; + assertTrue(Arrays.equals(expectedMechs, mechs)); + + nameType = GSSName.NT_HOSTBASED_SERVICE; + mechs = gssManager.getMechsForName(nameType); + assertTrue(Arrays.equals(expectedMechs, mechs)); + + nameType = GSSName.NT_EXPORT_NAME; + mechs = gssManager.getMechsForName(nameType); + assertTrue(Arrays.equals(expectedMechs, mechs)); + + nameType = KerberosUtils.KRB5_PRINCIPAL_NAMETYPE; + mechs = gssManager.getMechsForName(nameType); + assertTrue(Arrays.equals(expectedMechs, mechs)); + } + + public void testGetNamesForMech() throws Exception { + Oid kerberosMech = new Oid("1.2.840.113554.1.2.2"); + Oid[] nameTypes = gssManager.getNamesForMech(kerberosMech); + Oid[] expectedNameTypes = new Oid[] { GSSName.NT_USER_NAME, + GSSName.NT_HOSTBASED_SERVICE, GSSName.NT_EXPORT_NAME, + KerberosUtils.KRB5_PRINCIPAL_NAMETYPE }; + assertEquals(expectedNameTypes.length, nameTypes.length); + for (Oid expectedNameType : expectedNameTypes) { + boolean got = false; + for (Oid nameType : nameTypes) { + if (nameType.equals(expectedNameType)) { + got = true; + break; + } + } + if (!got) { + fail("Missing expected NameType " + expectedNameType); + } + } + } + + public void testCreateName() throws Exception { + + GSSName gssName = gssManager.createName("username", + GSSName.NT_USER_NAME); + assertEquals(GSSName.NT_USER_NAME, gssName.getStringNameType()); + + gssName = gssManager.createName("service@host", + GSSName.NT_HOSTBASED_SERVICE); + assertEquals(GSSName.NT_HOSTBASED_SERVICE, gssName.getStringNameType()); + + final Oid kerberosPrincipalOid = new Oid("1.2.840.113554.1.2.2.1"); + gssName = gssManager.createName("kerberosPrincipal", + kerberosPrincipalOid); + assertEquals(kerberosPrincipalOid, gssName.getStringNameType()); + + byte[] encoded = new byte[] { 4, 1, 0, 11, 6, 9, 42, -122, 72, -122, + -9, 18, 1, 2, 2, 0, 0, 0, 17, 115, 101, 114, 118, 105, 99, 101, + 47, 108, 111, 99, 97, 108, 104, 111, 115, 116 }; + gssName = gssManager.createName(encoded, GSSName.NT_EXPORT_NAME); + assertEquals(kerberosPrincipalOid, gssName.getStringNameType()); + GSSName expectedGSSName = gssManager.createName("service/localhost", kerberosPrincipalOid); + assertEquals(expectedGSSName, gssName); + } + + public void setUp() throws Exception{ + gssManager = GSSManager.getInstance(); + } + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\test\java\common\org\apache\harmony\auth\tests\jgss\GSSManagerImplTest.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/test/java/common/org/apache/harmony/auth/tests/jgss/kerberos/KerberosNameTest.java =================================================================== --- src/test/java/common/org/apache/harmony/auth/tests/jgss/kerberos/KerberosNameTest.java (revision 0) +++ src/test/java/common/org/apache/harmony/auth/tests/jgss/kerberos/KerberosNameTest.java (revision 0) @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.tests.jgss.kerberos; + +import java.util.Arrays; + +import org.apache.harmony.auth.jgss.kerberos.KerberosName; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +import junit.framework.TestCase; + +public class KerberosNameTest extends TestCase { + + + public void testExport() throws Exception { + KerberosName kerberosName = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + byte[] exported = kerberosName.export(); + byte[] expected = new byte[] { 4,1,0,11,6,9,42,-122,72,-122,-9,18,1,2,2,0,0,0,17,115,101,114,118,105,99,101,47,108,111,99,97,108,104,111,115,116 }; + assertTrue(Arrays.equals(expected, exported)); + } + + public void testEquals() throws Exception{ + KerberosName one = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + KerberosName another = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + assertEquals(one, another); + + one = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + another = new KerberosName("service/localhost", GSSName.NT_HOSTBASED_SERVICE); + assertEquals(one, another); + + one = new KerberosName("service@localhost", GSSName.NT_USER_NAME); + another = new KerberosName("service@localhost", GSSName.NT_USER_NAME); + assertEquals(one, another); + + one = new KerberosName("service@localhost", GSSName.NT_USER_NAME); + another = new KerberosName("service/localhost", GSSName.NT_USER_NAME); + assertFalse(one.equals(another)); + + final Oid KRB5_PRINCIPAL_NAMETYPE = new Oid("1.2.840.113554.1.2.2.1"); + one = new KerberosName("service@localhost", KRB5_PRINCIPAL_NAMETYPE); + another = new KerberosName("service@localhost", KRB5_PRINCIPAL_NAMETYPE); + assertEquals(one, another); + + one = new KerberosName("service@localhost", KRB5_PRINCIPAL_NAMETYPE); + another = new KerberosName("service/localhost",KRB5_PRINCIPAL_NAMETYPE); + assertFalse(one.equals(another)); + + one = new KerberosName("service@localhost", KRB5_PRINCIPAL_NAMETYPE); + another = new KerberosName("service@localhost", GSSName.NT_USER_NAME); + assertEquals(one,another); + + one = new KerberosName("service@localhost", KRB5_PRINCIPAL_NAMETYPE); + another = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + assertFalse(one.equals(another)); + + one = new KerberosName("service/localhost", KRB5_PRINCIPAL_NAMETYPE); + another = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + assertEquals(one,another); + + one = new KerberosName("service@localhost", GSSName.NT_USER_NAME); + another = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + assertFalse(one.equals(another)); + + one = new KerberosName("service/localhost", GSSName.NT_USER_NAME); + another = new KerberosName("service@localhost", GSSName.NT_HOSTBASED_SERVICE); + assertFalse(one.equals(another)); + } +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\test\java\common\org\apache\harmony\auth\tests\jgss\kerberos\KerberosNameTest.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSUtilsTest.java =================================================================== --- src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSUtilsTest.java (revision 0) +++ src/test/java/common/org/apache/harmony/auth/tests/jgss/GSSUtilsTest.java (revision 0) @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.tests.jgss; + +import org.apache.harmony.auth.jgss.GSSUtils; + +import junit.framework.TestCase; + +public class GSSUtilsTest extends TestCase { + + public void testGSSUtils_getBytes_and_getInt() throws Exception { + int i = 0x7F; + byte[] bytes = GSSUtils.getBytes(i, 1); + int j = GSSUtils.toInt(bytes, 0 , 1); + assertEquals(i, j); + + i = 0x0F; + bytes = GSSUtils.getBytes(i, 1); + j = GSSUtils.toInt(bytes, 0 , 1); + assertEquals(i, j); + + i = 0x01FF; + bytes = GSSUtils.getBytes(i, 2); + j = GSSUtils.toInt(bytes, 0, 2); + assertEquals(i, j); + + i = 0x0503; + bytes = GSSUtils.getBytes(i, 2); + j = GSSUtils.toInt(bytes, 0, 2); + assertEquals(i, j); + + i = 0x05804E; + bytes = GSSUtils.getBytes(i, 3); + j = GSSUtils.toInt(bytes, 0 , 3); + assertEquals(i, j); + + i = 0x0580E2; + bytes = GSSUtils.getBytes(i, 4); + j = GSSUtils.toInt(bytes, 0, 4); + assertEquals(i, j); + } +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\test\java\common\org\apache\harmony\auth\tests\jgss\GSSUtilsTest.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSNameImpl.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSNameImpl.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSNameImpl.java (revision 0) @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import org.apache.harmony.auth.jgss.GSSUtils; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public abstract class GSSNameImpl implements GSSName { +private static final byte EXPORTED_TOKEN_FIRST_BYTE = 0x04; + + private static final byte EXPORTED_TOKEN_SECOND_BYTE = 0x01; + + private static final int EXPORTED_TOKEN_LENGTH = 2; + + private static final int OID_LENGTH_ENCODED_LENGTH = 2; + + private static final int NAME_LENGTH_ENCODED_LENGTH = 4; + + private static final int FIX_CONTENT_LENGTH = EXPORTED_TOKEN_LENGTH + OID_LENGTH_ENCODED_LENGTH + NAME_LENGTH_ENCODED_LENGTH; + + + + static GSSName importFromString(byte[] encodedGSSName, + GSSManagerImpl gssManagerImpl) throws GSSException { + byte[] encoded = encodedGSSName; + int index = 0; + + if (encoded[index++] != EXPORTED_TOKEN_FIRST_BYTE + || encoded[index++] != EXPORTED_TOKEN_SECOND_BYTE) { + throw new GSSException(GSSUtils.DEFAULT_GSSEXCEPTION_MAJOR_CODE, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "Illegal token in importing string to GSSName"); + } + + int oidLength = GSSUtils.toInt(encoded, index, + OID_LENGTH_ENCODED_LENGTH); + index += OID_LENGTH_ENCODED_LENGTH; + + byte[] encodedMech = new byte[oidLength]; + System.arraycopy(encoded, index, encodedMech, 0, oidLength); + index += oidLength; + Oid mech = new Oid(encodedMech); + GSSMechSpi gssApi = gssManagerImpl.getSpi(mech); + + int nameLength = GSSUtils.toInt(encoded, index, + NAME_LENGTH_ENCODED_LENGTH); + index += NAME_LENGTH_ENCODED_LENGTH; + + byte[] encodedName = new byte[nameLength]; + System.arraycopy(encoded, index, encodedName, 0, nameLength); + String name = GSSUtils.toString(encodedName); + return gssApi.createName(name); + } + + public boolean equals(Object o){ + if( o instanceof GSSName){ + try { + return equals((GSSName) o); + } catch (GSSException e) { + } + } + return false; + } + + public byte[] export() throws GSSException { + byte[] name = exportMechDependent(); + byte[] oid = getMech().getDER(); + + byte[] encoded = new byte[FIX_CONTENT_LENGTH + oid.length + name.length]; + int index = 0; + encoded[index++] = EXPORTED_TOKEN_FIRST_BYTE; + encoded[index++] = EXPORTED_TOKEN_SECOND_BYTE; + + byte[] oid_length = GSSUtils.getBytes(oid.length, OID_LENGTH_ENCODED_LENGTH); + System.arraycopy(oid_length, 0, encoded, index, OID_LENGTH_ENCODED_LENGTH); + index += OID_LENGTH_ENCODED_LENGTH; + System.arraycopy(oid, 0, encoded, index, oid.length); + index += oid.length; + + + byte[] name_length = GSSUtils.getBytes(name.length, NAME_LENGTH_ENCODED_LENGTH); + System.arraycopy(name_length, 0, encoded, index, NAME_LENGTH_ENCODED_LENGTH); + index += NAME_LENGTH_ENCODED_LENGTH; + System.arraycopy(name, 0, encoded, index, name.length); + return encoded; + } + + protected abstract byte[] exportMechDependent() throws GSSException; + protected abstract Oid getMech(); +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\GSSNameImpl.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialElement.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialElement.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialElement.java (revision 0) @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public interface GSSCredentialElement { + + public GSSName getName(); + + public Oid getMech(); + + public int getUsage(); + + public int getRemainingAcceptLifetime(); + + public int getRemainingInitLifetime(); + + public void dispose() throws GSSException; + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\GSSCredentialElement.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSMechSpi.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSMechSpi.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSMechSpi.java (revision 0) @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public interface GSSMechSpi { + + public Oid[] getNameMechs(); + + public GSSName createName(String name, Oid nameType) throws GSSException; + + public GSSName createName(String name) throws GSSException; + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\GSSMechSpi.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSManagerImpl.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSManagerImpl.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSManagerImpl.java (revision 0) @@ -0,0 +1,226 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import java.security.Provider; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Set; +import java.util.Map.Entry; + +import org.apache.harmony.auth.jgss.kerberos.KerberosSpiImpl; +import org.apache.harmony.auth.jgss.kerberos.KerberosProvider; +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public class GSSManagerImpl extends GSSManager { + + private static Oid DEFAULT_MECH; + + private static Provider DEFAULT_PROVIDER = new KerberosProvider("kerberos provider", 0, ""); + + private static GSSMechSpi DEFAULT_API = new KerberosSpiImpl(); + + + static { + try { + DEFAULT_MECH = new Oid("1.2.840.113554.1.2.2"); + } catch (GSSException e) { + + } + } + + public GSSManagerImpl() throws GSSException{ + addProviderAtFront(DEFAULT_PROVIDER, null); + } + + private Hashtable spis = new Hashtable(); + + private static final String JGSSAPI = "GssApiMechanism."; + + private void enumApisFromProvider(Provider p, Oid mech, boolean override) { + for (Entry entry : p.entrySet()) { + String key = (String) entry.getKey(); + + String value = (String) entry.getValue(); + + if (!key.startsWith(JGSSAPI)) { + continue; + } + + String currentMechName = key.substring(JGSSAPI.length()).trim(); + Oid currentMech; + try { + currentMech = new Oid(currentMechName); + } catch (GSSException e) { + continue; + } + + if (mech != null && !mech.equals(currentMech)) { + continue; + } + + if (!override && spis.get(currentMech) != null) { + continue; + } + + GSSMechSpi gssApi; + try { + gssApi = (GSSMechSpi) Class.forName(value).newInstance(); + } catch (Exception e) { + continue; + } + spis.put(currentMech, gssApi); + } + } + + @Override + public void addProviderAtEnd(Provider p, Oid mech) throws GSSException { + enumApisFromProvider(p, mech, false); + } + + @Override + public void addProviderAtFront(Provider p, Oid mech) throws GSSException { + enumApisFromProvider(p, mech, true); + } + + @Override + public GSSContext createContext(GSSName peer, Oid mech, + GSSCredential myCred, int lifetime) throws GSSException { + + return null; + } + + @Override + public GSSContext createContext(GSSCredential myCred) throws GSSException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GSSContext createContext(byte[] interProcessToken) + throws GSSException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GSSCredential createCredential(int usage) throws GSSException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GSSCredential createCredential(GSSName name, int lifetime, Oid mech, + int usage) throws GSSException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GSSCredential createCredential(GSSName name, int lifetime, + Oid[] mechs, int usage) throws GSSException { + // TODO Auto-generated method stub + return null; + } + + @Override + public GSSName createName(String nameStr, Oid nameType) throws GSSException { + if(nameType != null && nameType.equals(GSSName.NT_EXPORT_NAME)){ + return GSSNameImpl.importFromString(GSSUtils.getBytes(nameStr), this); + } + return DEFAULT_API.createName(nameStr, nameType); + } + + @Override + public GSSName createName(byte[] name, Oid nameType) throws GSSException { + if (nameType != null && nameType.equals(GSSName.NT_EXPORT_NAME)) { + return GSSNameImpl.importFromString(name, this); + } + return DEFAULT_API.createName(GSSUtils.toString(name), nameType); + } + + @Override + public GSSName createName(String nameStr, Oid nameType, Oid mech) + throws GSSException { + return createName(nameStr, nameType).canonicalize(mech); + } + + @Override + public GSSName createName(byte[] name, Oid nameType, Oid mech) + throws GSSException { + return createName(GSSUtils.toString(name), nameType, mech); + } + + @Override + public Oid[] getMechs() { + Set oids = spis.keySet(); + Oid[] mechs = new Oid[oids.size()]; + int i = 0; + for (Oid oid : oids) { + mechs[i++] = oid; + } + return mechs; + } + + @Override + public Oid[] getMechsForName(Oid nameType) { + ArrayList mechs = new ArrayList(); + Oid[] oids = getMechs(); + for (Oid oid : oids) { + GSSMechSpi api = spis.get(oid); + Oid[] mechNames = api.getNameMechs(); + boolean support = false; + for (Oid mechName : mechNames) { + if (mechName.equals(nameType)) { + support = true; + break; + } + } + if (support) { + mechs.add(oid); + } + } + return mechs.toArray(new Oid[mechs.size()]); + } + + @Override + public Oid[] getNamesForMech(Oid mech) throws GSSException { + GSSMechSpi api = getSpi(mech); + return api.getNameMechs(); + } + + GSSMechSpi getSpi(Oid mech){ + return spis.get(mech); + } + + Oid getDefaultMech(){ + return DEFAULT_MECH; + } + + + + GSSCredentialElement createCredentialElement(GSSName name, int initLifetime, int acceptLifetime, Oid mech, int usage) { + // TODO Auto-generated method stub + return null; + } +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\GSSManagerImpl.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialImpl.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialImpl.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSCredentialImpl.java (revision 0) @@ -0,0 +1,289 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map.Entry; + +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public class GSSCredentialImpl implements GSSCredential { + + private GSSCredentialElement defaultCredentialElement; + + private HashMap credentials = new HashMap(); + + private boolean disposed; + + private final GSSManagerImpl managerImpl; + + public GSSCredentialImpl(GSSManagerImpl managerImpl) { + this.managerImpl = managerImpl; + } + + public void add(GSSName name, int initLifetime, int acceptLifetime, + Oid mech, int usage) throws GSSException { + checkDisposed(); + + if (mech == null) { + mech = managerImpl.getDefaultMech(); + } + + GSSCredentialType credentialType = new GSSCredentialType(mech, usage); + if (credentials.containsKey(credentialType)) { + throw new GSSException(GSSException.DUPLICATE_ELEMENT, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, mech + " " + + usage); + } + + GSSCredentialElement credentialElement = managerImpl + .createCredentialElement(name, initLifetime, acceptLifetime, + mech, usage); + defaultCredentialElement = credentialElement; + credentials.put(credentialType, credentialElement); + } + + public void dispose() throws GSSException { + if (disposed) { + return; + } + + for (GSSCredentialElement credential : credentials.values()) { + credential.dispose(); + } + disposed = true; + } + + public Oid[] getMechs() throws GSSException { + checkDisposed(); + ArrayList mechs = new ArrayList(); + for (GSSCredentialType credentialType : credentials.keySet()) { + Oid mech = credentialType.mech; + if (!mechs.contains(mech)) { + mechs.add(mech); + } + } + return mechs.toArray(new Oid[mechs.size()]); + } + + public GSSName getName() throws GSSException { + checkDisposed(); + return defaultCredentialElement.getName(); + } + + public GSSName getName(Oid mech) throws GSSException { + checkDisposed(); + GSSCredentialElement credential = null; + for (Entry entry : credentials + .entrySet()) { + if (entry.getKey().mech.equals(mech)) { + credential = entry.getValue(); + break; + } + } + if (null == credential) { + throw new GSSException(GSSException.BAD_MECH, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "fail to get name for " + mech); + } + return credential.getName(); + } + + public int getRemainingAcceptLifetime(Oid mech) throws GSSException { + checkDisposed(); + GSSCredentialElement credential = null; + int remainingAcceptLifetime = Integer.MIN_VALUE; + credential = credentials.get(new GSSCredentialType(mech, + GSSCredential.INITIATE_ONLY)); + if (credential != null) { + remainingAcceptLifetime = credential.getRemainingAcceptLifetime(); + } + GSSCredentialElement tempCredential = credentials + .get(new GSSCredentialType(mech, + GSSCredential.INITIATE_AND_ACCEPT)); + if (tempCredential != null) { + credential = tempCredential; + remainingAcceptLifetime = Math.max(remainingAcceptLifetime, + credential.getRemainingAcceptLifetime()); + } + + if (credential == null) { + throw new GSSException(GSSException.BAD_MECH, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "no credential for mech " + mech); + } + return remainingAcceptLifetime; + } + + public int getRemainingInitLifetime(Oid mech) throws GSSException { + checkDisposed(); + GSSCredentialElement credential = null; + int remainingInitLifetime = Integer.MIN_VALUE; + credential = credentials.get(new GSSCredentialType(mech, + GSSCredential.INITIATE_ONLY)); + if (credential != null) { + remainingInitLifetime = credential.getRemainingInitLifetime(); + } + GSSCredentialElement tempCredential = credentials + .get(new GSSCredentialType(mech, + GSSCredential.INITIATE_AND_ACCEPT)); + if (tempCredential != null) { + credential = tempCredential; + remainingInitLifetime = Math.max(remainingInitLifetime, credential + .getRemainingInitLifetime()); + } + + if (credential == null) { + throw new GSSException(GSSException.BAD_MECH, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "no credential for mech " + mech); + } + return remainingInitLifetime; + } + + public int getRemainingLifetime() throws GSSException { + checkDisposed(); + int remainingLifeTime = GSSCredential.INDEFINITE_LIFETIME; + for (Entry credential : credentials + .entrySet()) { + GSSCredentialType credentialType = credential.getKey(); + GSSCredentialElement credentialElement = credential.getValue(); + int credentialRemainingLifeTime; + switch (credentialType.usage) { + case GSSCredential.INITIATE_ONLY: + credentialRemainingLifeTime = credentialElement + .getRemainingInitLifetime(); + break; + case GSSCredential.ACCEPT_ONLY: + credentialRemainingLifeTime = credentialElement + .getRemainingAcceptLifetime(); + break; + default: // INITIATE_AND_ACCEPT + credentialRemainingLifeTime = Math.min(credentialElement + .getRemainingInitLifetime(), credentialElement + .getRemainingAcceptLifetime()); + break; + } + remainingLifeTime = Math.min(remainingLifeTime, + credentialRemainingLifeTime); + + } + return remainingLifeTime; + } + + public int getUsage() throws GSSException { + checkDisposed(); + boolean isInitiate = false; + boolean isAccept = false; + for (GSSCredentialType credentialType : credentials.keySet()) { + switch (credentialType.usage) { + case GSSCredential.INITIATE_ONLY: + isInitiate = true; + break; + case GSSCredential.ACCEPT_ONLY: + isAccept = true; + break; + case GSSCredential.INITIATE_AND_ACCEPT: + isInitiate = isAccept = true; + } + } + + if (isInitiate) { + if (isAccept) { + return GSSCredential.INITIATE_AND_ACCEPT; + } + return GSSCredential.INITIATE_ONLY; + } + if (isAccept) { + return GSSCredential.ACCEPT_ONLY; + } + throw new GSSException(GSSException.FAILURE, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "no credential element in this credential"); + } + + public int getUsage(Oid mech) throws GSSException { + checkDisposed(); + boolean isInitiate = false; + boolean isAccept = false; + for (GSSCredentialType credentialType : credentials.keySet()) { + if (credentialType.mech.equals(mech)) { + switch (credentialType.usage) { + case GSSCredential.INITIATE_ONLY: + isInitiate = true; + break; + case GSSCredential.ACCEPT_ONLY: + isAccept = true; + break; + case GSSCredential.INITIATE_AND_ACCEPT: + isInitiate = isAccept = true; + } + } + } + + if (isInitiate) { + if (isAccept) { + return GSSCredential.INITIATE_AND_ACCEPT; + } + return GSSCredential.INITIATE_ONLY; + } + if (isAccept) { + return GSSCredential.ACCEPT_ONLY; + } + throw new GSSException(GSSException.BAD_MECH, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "no credential for mech " + mech); + } + + private void checkDisposed() throws GSSException { + if (disposed) { + throw new GSSException(GSSUtils.DEFAULT_GSSEXCEPTION_MAJOR_CODE, + GSSUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "credential disposed"); + } + } + + private static class GSSCredentialType { + public final Oid mech; + + public final int usage; + + public GSSCredentialType(Oid mech, int usage) { + this.mech = mech; + this.usage = usage; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof GSSCredentialType)) { + return false; + } + GSSCredentialType otherType = (GSSCredentialType) other; + return mech.equals(otherType.mech) && usage == otherType.usage; + } + + @Override + public int hashCode() { + return mech.hashCode() + usage; + } + } +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\GSSCredentialImpl.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosProvider.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosProvider.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosProvider.java (revision 0) @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss.kerberos; + +import java.security.Provider; + +public class KerberosProvider extends Provider +{ + + public KerberosProvider(String arg0, double arg1, String arg2) { + super(arg0, arg1, arg2); + this.put("GssApiMechanism.1.2.840.113554.1.2.2", "org.apache.harmony.auth.jgss.kerberos.KerberosSpiImpl"); + } + + /** + * + */ + private static final long serialVersionUID = 1L; + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\kerberos\KerberosProvider.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosSpiImpl.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosSpiImpl.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosSpiImpl.java (revision 0) @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss.kerberos; + +import org.apache.harmony.auth.jgss.GSSMechSpi; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public class KerberosSpiImpl implements GSSMechSpi { + + public GSSName createName(String name, Oid nameType) throws GSSException { + return new KerberosName(name, nameType); + } + + public GSSName createName(String name) throws GSSException{ + return createName(name, KerberosUtils.KRB5_PRINCIPAL_NAMETYPE); + } + + public GSSName createName(byte[] encodedName){ + return null; + } + + public Oid[] getNameMechs(){ + return KerberosUtils.SUPPORTED_NAME_MECHS; + } + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\kerberos\KerberosSpiImpl.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosName.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosName.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosName.java (revision 0) @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss.kerberos; + +import org.apache.harmony.auth.jgss.GSSNameImpl; +import org.apache.harmony.auth.jgss.GSSUtils; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +/** + * Current the org.apache.harmony.auth.jgss.GSSNameImpl just supports kerberos + * related GSSName. + */ +public class KerberosName extends GSSNameImpl { + + private String name; + + private Oid nameType; + + public KerberosName(String name, Oid nameType) throws GSSException { + if (null == name) { + throw new GSSException(KerberosUtils.DEFAULT_GSSEXCEPTION_MAJOR_CODE, + KerberosUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "Cannot import null GSSName"); + } + + if (null == nameType) { + nameType = KerberosUtils.KRB5_PRINCIPAL_NAMETYPE; + } + + if(nameType.equals(GSSName.NT_HOSTBASED_SERVICE)){ + name = name.replaceAll("@", "/"); + } + + if (!(nameType.equals(GSSName.NT_HOSTBASED_SERVICE) + || nameType.equals(GSSName.NT_USER_NAME) || nameType + .equals(KerberosUtils.KRB5_PRINCIPAL_NAMETYPE))) { + throw new GSSException( + KerberosUtils.DEFAULT_GSSEXCEPTION_MAJOR_CODE, + KerberosUtils.DEFAULT_GSSEXCEPTION_MINOR_CODE, + "Unsupported OID"); + } + this.name = name; + this.nameType = nameType; + } + + String getName() { + return name; + } + + public GSSName canonicalize(Oid mech) throws GSSException { + return new KerberosName(getName(), mech); + } + + public boolean equals(GSSName another) throws GSSException { + if (isAnonymous() && another.isAnonymous()) { + return true; + } + + if (!(another instanceof KerberosName)) { + + return false; + } + + KerberosName anotherNameImpl = (KerberosName) another; + String thisName = getName(); + String anotherName = anotherNameImpl.getName(); + + if (!thisName.equals(anotherName)) { + return false; + } + + Oid thisOid = getStringNameType(); + Oid anotherOid = anotherNameImpl.getStringNameType(); + + if (thisOid.equals(KerberosUtils.KRB5_PRINCIPAL_NAMETYPE) + || anotherOid.equals(KerberosUtils.KRB5_PRINCIPAL_NAMETYPE)) { + return true; + } + return thisOid.equals(anotherOid); + } + + + + public Oid getStringNameType() throws GSSException { + return nameType; + } + + // org.apache.harmoy.auth.jgss.GSSNameImpl actually does not support + // GSSNAME.NT_ANONYMOUS, so it always returns false. + public boolean isAnonymous() { + return nameType.equals(GSSName.NT_ANONYMOUS); + } + + // org.apache.harmoy.auth.jgss.GSSNameImpl only supports MN GSSNAME. + public boolean isMN() { + return true; + } + + public String toString(){ + return name; + } + + @Override + protected byte[] exportMechDependent() throws GSSException { + return GSSUtils.getBytes(name); + } + + @Override + protected Oid getMech() { + return KerberosUtils.KRB5_MECH; + } +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\kerberos\KerberosName.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosUtils.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosUtils.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/kerberos/KerberosUtils.java (revision 0) @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss.kerberos; + +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; + +public class KerberosUtils { + public static final String DEFAULT_CHARSET_NAME = "UTF-8"; + + public static final int DEFAULT_GSSEXCEPTION_MAJOR_CODE = 3; + + public static final int DEFAULT_GSSEXCEPTION_MINOR_CODE = 0; + + public static final Oid KRB5_MECH; + + public static final Oid KRB5_PRINCIPAL_NAMETYPE; + + public static final Oid[] SUPPORTED_NAME_MECHS; + + static { + try { + KRB5_MECH = new Oid("1.2.840.113554.1.2.2"); + KRB5_PRINCIPAL_NAMETYPE = new Oid("1.2.840.113554.1.2.2.1"); + + } catch (GSSException e) { + throw new Error(); + } + SUPPORTED_NAME_MECHS = new Oid[] { GSSName.NT_USER_NAME, + GSSName.NT_HOSTBASED_SERVICE, GSSName.NT_EXPORT_NAME, + KRB5_PRINCIPAL_NAMETYPE }; + } + +} Property changes on: D:\workspaces\workspace\harmony\modules\auth\src\main\java\common\org\apache\harmony\auth\jgss\kerberos\KerberosUtils.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/main/java/common/org/apache/harmony/auth/jgss/GSSUtils.java =================================================================== --- src/main/java/common/org/apache/harmony/auth/jgss/GSSUtils.java (revision 0) +++ src/main/java/common/org/apache/harmony/auth/jgss/GSSUtils.java (revision 0) @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.harmony.auth.jgss; + +import java.io.UnsupportedEncodingException; + +import org.ietf.jgss.GSSException; + +public class GSSUtils { + + public static final String DEFAULT_CHARSET_NAME = "UTF-8"; + + public static final int DEFAULT_GSSEXCEPTION_MAJOR_CODE = 3; + + public static final int DEFAULT_GSSEXCEPTION_MINOR_CODE = 0; + + public static String toString(byte[] bytes) throws GSSException { + try { + return new String(bytes, DEFAULT_CHARSET_NAME); + } catch (UnsupportedEncodingException e) { + throw new GSSException(DEFAULT_GSSEXCEPTION_MAJOR_CODE, + DEFAULT_GSSEXCEPTION_MINOR_CODE, e.getMessage()); + } + } + + public static byte[] getBytes(String s) throws GSSException { + try { + return s.getBytes(DEFAULT_CHARSET_NAME); + } catch (UnsupportedEncodingException e) { + throw new GSSException(DEFAULT_GSSEXCEPTION_MAJOR_CODE, + DEFAULT_GSSEXCEPTION_MINOR_CODE, e.getMessage()); + } + } + + public static byte[] getBytes(int source, int length) { + if (source < 0) { + throw new Error( + "org.apache.harmony.auth.jgss.GSSUtils.getBytes(int i, int length) does not support negative integer"); + } + if (length <= 0 || length > 4) { + throw new Error( + "org.apache.harmony.auth.jgss.GSSUtils.getBytes(int i, int length) must have 0>> shift); + shift -=8; + } + return target; + } + + public static int toInt(byte[] source, int offset, int length) { + if (length == 0 || length > 4) { + throw new Error( + "org.apache.harmony.auth.jgss.GSSUtils.toInt(byte[] source) must have 0