mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-30 19:53:46 +00:00
502 lines
23 KiB
Java
502 lines
23 KiB
Java
/* GSSManager.java -- manager class for the GSS-API.
|
|
Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Classpath.
|
|
|
|
GNU Classpath is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
GNU Classpath is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Classpath; see the file COPYING. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
|
|
Linking this library statically or dynamically with other modules is
|
|
making a combined work based on this library. Thus, the terms and
|
|
conditions of the GNU General Public License cover the whole
|
|
combination.
|
|
|
|
As a special exception, the copyright holders of this library give you
|
|
permission to link this library with independent modules to produce an
|
|
executable, regardless of the license terms of these independent
|
|
modules, and to copy and distribute the resulting executable under
|
|
terms of your choice, provided that you also meet, for each linked
|
|
independent module, the terms and conditions of the license of that
|
|
module. An independent module is a module which is not derived from
|
|
or based on this library. If you modify this library, you may extend
|
|
this exception to your version of the library, but you are not
|
|
obligated to do so. If you do not wish to do so, delete this
|
|
exception statement from your version.
|
|
|
|
The documentation comments of this class are derived from the text
|
|
of RFC 2853: Generic Security Service API Version 2: Java Bindings.
|
|
That document is covered under the following license notice:
|
|
|
|
Copyright (C) The Internet Society (2000). All Rights Reserved.
|
|
|
|
This document and translations of it may be copied and furnished to
|
|
others, and derivative works that comment on or otherwise explain it
|
|
or assist in its implementation may be prepared, copied, published and
|
|
distributed, in whole or in part, without restriction of any kind,
|
|
provided that the above copyright notice and this paragraph are
|
|
included on all such copies and derivative works. However, this
|
|
document itself may not be modified in any way, such as by removing
|
|
the copyright notice or references to the Internet Society or other
|
|
Internet organizations, except as needed for the purpose of developing
|
|
Internet standards in which case the procedures for copyrights defined
|
|
in the Internet Standards process must be followed, or as required to
|
|
translate it into languages other than English.
|
|
|
|
The limited permissions granted above are perpetual and will not be
|
|
revoked by the Internet Society or its successors or assigns.
|
|
|
|
This document and the information contained herein is provided on an
|
|
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
|
|
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
|
|
NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
|
|
WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. */
|
|
|
|
|
|
package org.ietf.jgss;
|
|
|
|
import java.security.Provider;
|
|
import java.security.Security;
|
|
|
|
/**
|
|
* <p>The GSSManager class is an abstract class that serves as a factory
|
|
* for three GSS interfaces: {@link GSSName}, {@link GSSCredential}, and
|
|
* {@link GSSContext}. It also provides methods for applications to determine
|
|
* what mechanisms are available from the GSS implementation and what
|
|
* nametypes these mechanisms support. An instance of the default GSSManager
|
|
* subclass may be obtained through the static method {@link #getInstance()},
|
|
* but applications are free to instantiate other subclasses of GSSManager.</p>
|
|
*
|
|
* <p>All but one method in this class are declared abstract. This means
|
|
* that subclasses have to provide the complete implementation for those
|
|
* methods. The only exception to this is the static method {@link
|
|
* #getInstance()} which will have platform specific code to return an
|
|
* instance of the default subclass.</p>
|
|
*
|
|
* <p>Platform providers of GSS are required not to add any constructors to
|
|
* this class, private, public, or protected. This will ensure that all
|
|
* subclasses invoke only the default constructor provided to the base
|
|
* class by the compiler.</p>
|
|
*
|
|
* <p>A subclass extending the GSSManager abstract class may be implemented
|
|
* as a modular provider based layer that utilizes some well known
|
|
* service provider specification. The GSSManager API provides the
|
|
* application with methods to set provider preferences on such an
|
|
* implementation. These methods also allow the implementation to throw
|
|
* a well-defined exception in case provider based configuration is not
|
|
* supported. Applications that expect to be portable should be aware of
|
|
* this and recover cleanly by catching the exception.</p>
|
|
*
|
|
* <p>It is envisioned that there will be three most common ways in which
|
|
* providers will be used:</p>
|
|
*
|
|
* <ol>
|
|
* <li>The application does not care about what provider is used (the
|
|
* default case).</li>
|
|
*
|
|
* <li>The application wants a particular provider to be used
|
|
* preferentially, either for a particular mechanism or all the
|
|
* time, irrespective of mechanism.</li>
|
|
*
|
|
* <li>The application wants to use the locally configured providers
|
|
* as far as possible but if support is missing for one or more
|
|
* mechanisms then it wants to fall back on its own provider.</li>
|
|
* </ol>
|
|
*
|
|
* <p>The GSSManager class has two methods that enable these modes of
|
|
* usage: {@link #addProviderAtFront(java.security.Provider,org.ietf.jgss.Oid)}
|
|
* and {@link #addProviderAtEnd(java.security.Provider,org.ietf.jgss.Oid)}.
|
|
* These methods have the effect of creating an ordered list of
|
|
* (<i>provider</i>, <i>oid</i>) pairs where each pair indicates a preference
|
|
* of provider for a given oid.</p>
|
|
*
|
|
* <p>The use of these methods does not require any knowledge of whatever
|
|
* service provider specification the GSSManager subclass follows. It is
|
|
* hoped that these methods will serve the needs of most applications.
|
|
* Additional methods may be added to an extended GSSManager that could
|
|
* be part of a service provider specification that is standardized
|
|
* later.</p>
|
|
*
|
|
* <h3>Example Code</h3>
|
|
*
|
|
* <pre>
|
|
GSSManager mgr = GSSManager.getInstance();
|
|
|
|
// What mechs are available to us?
|
|
Oid[] supportedMechs = mgr.getMechs();
|
|
|
|
// Set a preference for the provider to be used when support is needed
|
|
// for the mechanisms "1.2.840.113554.1.2.2" and "1.3.6.1.5.5.1.1".
|
|
|
|
Oid krb = new Oid("1.2.840.113554.1.2.2");
|
|
Oid spkm1 = new Oid("1.3.6.1.5.5.1.1");
|
|
|
|
Provider p = (Provider) (new com.foo.security.Provider());
|
|
|
|
mgr.addProviderAtFront(p, krb);
|
|
mgr.addProviderAtFront(p, spkm1);
|
|
|
|
// What name types does this spkm implementation support?
|
|
Oid[] nameTypes = mgr.getNamesForMech(spkm1);
|
|
</pre>
|
|
*/
|
|
public abstract class GSSManager
|
|
{
|
|
|
|
// Constructor.
|
|
// -------------------------------------------------------------------------
|
|
|
|
public GSSManager()
|
|
{
|
|
}
|
|
|
|
// Class method.
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the default GSSManager implementation.
|
|
*
|
|
* @return The default GSSManager implementation.
|
|
*/
|
|
public static synchronized GSSManager getInstance()
|
|
{
|
|
String impl = Security.getProperty("org.ietf.jgss.GSSManager");
|
|
if (impl == null)
|
|
impl = "gnu.crypto.gssapi.GSSManagerImpl";
|
|
try
|
|
{
|
|
ClassLoader loader = GSSManager.class.getClassLoader();
|
|
if (loader == null)
|
|
loader = ClassLoader.getSystemClassLoader();
|
|
Class<?> c = loader.loadClass(impl);
|
|
return (GSSManager) c.newInstance();
|
|
}
|
|
catch (Exception x)
|
|
{
|
|
throw new RuntimeException(x.toString());
|
|
}
|
|
}
|
|
|
|
// Abstract methods.
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* <p>This method is used to indicate to the GSSManager that the
|
|
* application would like a particular provider to be used if no other
|
|
* provider can be found that supports the given mechanism. When a value
|
|
* of null is used instead of an Oid for the mechanism, the GSSManager
|
|
* must use the indicated provider for any mechanism.</p>
|
|
*
|
|
* <p>Calling this method repeatedly preserves the older settings but
|
|
* raises them above newer ones in preference thus forming an ordered
|
|
* list of providers and Oid pairs that grows at the bottom. Thus the
|
|
* older provider settings will be utilized first before this one is.</p>
|
|
*
|
|
* <p>If there are any previously existing preferences that conflict with
|
|
* the preference being set here, then the GSSManager should ignore this
|
|
* request.</p>
|
|
*
|
|
* <p>If the GSSManager implementation does not support an SPI with a
|
|
* pluggable provider architecture it should throw a GSSException with
|
|
* the status code {@link GSSException#UNAVAILABLE} to indicate that the
|
|
* operation is unavailable.</p>
|
|
*
|
|
* @param p The provider instance that should be used whenever
|
|
* support is needed for <i>mech</i>.
|
|
* @param mech The mechanism for which the provider is being set.
|
|
* @throws GSSException If this service is unavailable.
|
|
*/
|
|
public abstract void addProviderAtEnd(Provider p, Oid mech)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* <p>This method is used to indicate to the GSSManager that the
|
|
* application would like a particular provider to be used ahead of all
|
|
* others when support is desired for the given mechanism. When a value
|
|
* of null is used instead of an Oid for the mechanism, the GSSManager
|
|
* must use the indicated provider ahead of all others no matter what
|
|
* the mechanism is. Only when the indicated provider does not support
|
|
* the needed mechanism should the GSSManager move on to a different
|
|
* provider.</p>
|
|
*
|
|
* <p>Calling this method repeatedly preserves the older settings but
|
|
* lowers them in preference thus forming an ordered list of provider
|
|
* and Oid pairs that grows at the top.</p>
|
|
*
|
|
* <p>Calling addProviderAtFront with a null Oid will remove all previous
|
|
* preferences that were set for this provider in the GSSManager
|
|
* instance. Calling addProviderAtFront with a non-null Oid will remove
|
|
* any previous preference that was set using this mechanism and this
|
|
* provider together.</p>
|
|
*
|
|
* <p>If the GSSManager implementation does not support an SPI with a
|
|
* pluggable provider architecture it should throw a GSSException with
|
|
* the status code {@link GSSException#UNAVAILABLE} to indicate that the
|
|
* operation is unavailable.</p>
|
|
*
|
|
* @param p The provider instance that should be used whenever
|
|
* support is needed for <i>mech</i>.
|
|
* @param mech The mechanism for which the provider is being set.
|
|
* @throws GSSException If this service is unavailable.
|
|
*/
|
|
public abstract void addProviderAtFront(Provider p, Oid mech)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method for creating a previously exported context. The
|
|
* context properties will be determined from the input token and can't
|
|
* be modified through the set methods.
|
|
*
|
|
* @param interProcessToken The token previously emitted from the
|
|
* export method.
|
|
* @return The context.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSContext createContext(byte[] interProcessToken)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method for creating a context on the acceptor' side. The
|
|
* context's properties will be determined from the input token supplied
|
|
* to the accept method.
|
|
*
|
|
* @param myCred Credentials for the acceptor. Use <code>null</code> to
|
|
* act as a default acceptor principal.
|
|
* @return The context.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSContext createContext(GSSCredential myCred)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method for creating a context on the initiator's side.
|
|
* Context flags may be modified through the mutator methods prior to
|
|
* calling {@link
|
|
* GSSContext#initSecContext(java.io.InputStream,java.io.OutputStream)}.
|
|
*
|
|
* @param peer Name of the target peer.
|
|
* @param mech Oid of the desired mechanism. Use <code>null</code>
|
|
* to request default mechanism.
|
|
* @param myCred Credentials of the initiator. Use <code>null</code>
|
|
* default initiator principal.
|
|
* @param lifetime The request lifetime, in seconds, for the context.
|
|
* Use {@link GSSContext#INDEFINITE_LIFETIME} and
|
|
* {@link GSSContext#DEFAULT_LIFETIME} to request
|
|
* indefinite or default context lifetime.
|
|
* @return The context.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSContext createContext(GSSName peer, Oid mech,
|
|
GSSCredential myCred, int lifetime)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method for acquiring default credentials. This will cause
|
|
* the GSS-API to use system specific defaults for the set of
|
|
* mechanisms, name, and a DEFAULT lifetime.
|
|
*
|
|
* @param usage The intended usage for this credential object. The
|
|
* value of this parameter must be one of:
|
|
* {@link GSSCredential#ACCEPT_AND_INITIATE},
|
|
* {@link GSSCredential#ACCEPT_ONLY},
|
|
* {@link GSSCredential#INITIATE_ONLY}.
|
|
* @return The credential.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSCredential createCredential(int usage) throws GSSException;
|
|
|
|
/**
|
|
* Factory method for acquiring a single mechanism credential.
|
|
*
|
|
* @param aName Name of the principal for whom this credential is to
|
|
* be acquired. Use <code>null</code> to specify the
|
|
* default principal.
|
|
* @param lifetime The number of seconds that credentials should remain
|
|
* valid. Use {@link GSSCredential#INDEFINITE_LIFETIME}
|
|
* to request that the credentials have the maximum
|
|
* permitted lifetime. Use {@link
|
|
* GSSCredential#DEFAULT_LIFETIME} to request default
|
|
* credential lifetime.
|
|
* @param mech The oid of the desired mechanism. Use <code>null</code>
|
|
* to request the default mechanism(s).
|
|
* @param usage The intended usage for this credential object. The
|
|
* value of this parameter must be one of:
|
|
* {@link GSSCredential#ACCEPT_AND_INITIATE},
|
|
* {@link GSSCredential#ACCEPT_ONLY},
|
|
* {@link GSSCredential#INITIATE_ONLY}.
|
|
* @return The credential.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSCredential createCredential(GSSName aName, int lifetime,
|
|
Oid mech, int usage)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method for acquiring credentials over a set of mechanisms.
|
|
* Acquires credentials for each of the mechanisms specified in the
|
|
* array called mechs. To determine the list of mechanisms' for which
|
|
* the acquisition of credentials succeeded, the caller should use the
|
|
* {@link GSSCredential#getMechs()} method.
|
|
*
|
|
* @param aName Name of the principal for whom this credential is to
|
|
* be acquired. Use <code>null</code> to specify the
|
|
* default principal.
|
|
* @param lifetime The number of seconds that credentials should remain
|
|
* valid. Use {@link GSSCredential#INDEFINITE_LIFETIME}
|
|
* to request that the credentials have the maximum
|
|
* permitted lifetime. Use {@link
|
|
* GSSCredential#DEFAULT_LIFETIME} to request default
|
|
* credential lifetime.
|
|
* @param mechs The array of mechanisms over which the credential is
|
|
* to be acquired. Use <code>null</code> for requesting
|
|
* a system specific default set of mechanisms.
|
|
* @param usage The intended usage for this credential object. The
|
|
* value of this parameter must be one of:
|
|
* {@link GSSCredential#ACCEPT_AND_INITIATE},
|
|
* {@link GSSCredential#ACCEPT_ONLY},
|
|
* {@link GSSCredential#INITIATE_ONLY}.
|
|
* @return The credential.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSCredential createCredential(GSSName aName, int lifetime,
|
|
Oid[] mechs, int usage)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method to convert a contiguous byte array containing a name
|
|
* from the specified namespace to a {@link GSSName} object. In general,
|
|
* the {@link GSSName} object created will not be an MN; two examples that
|
|
* are exceptions to this are when the namespace type parameter indicates
|
|
* {@link GSSName#NT_EXPORT_NAME} or when the GSS-API implementation is not
|
|
* multi-mechanism.
|
|
*
|
|
* @param name The byte array containing the name to create.
|
|
* @param nameType The Oid specifying the namespace of the name supplied
|
|
* in the byte array. Note that nameType serves to
|
|
* describe and qualify the interpretation of the input
|
|
* name byte array, it does not necessarily imply a type
|
|
* for the output GSSName implementation. "null" value
|
|
* can be used to specify that a mechanism specific
|
|
* default syntax should be assumed by each mechanism
|
|
* that examines the byte array.
|
|
* @return The name.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSName createName(byte[] name, Oid nameType)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method to convert a contiguous byte array containing a name
|
|
* from the specified namespace to a GSSName object that is an MN. In
|
|
* other words, this method is a utility that does the equivalent of two
|
|
* steps: {@link #createName(byte[],org.ietf.jgss.Oid)} and then also
|
|
* {@link GSSName#canonicalize(org.ietf.jgss.Oid)}.
|
|
*
|
|
* @param name The byte array representing the name to create.
|
|
* @param nameType The Oid specifying the namespace of the name supplied
|
|
* in the byte array. Note that nameType serves to
|
|
* describe and qualify the interpretation of the input
|
|
* name byte array, it does not necessarily imply a type
|
|
* for the output GSSName implementation. "null" value
|
|
* can be used to specify that a mechanism specific
|
|
* default syntax should be assumed by each mechanism
|
|
* that examines the byte array.
|
|
* @param mech Oid specifying the mechanism for which this name
|
|
* should be created.
|
|
* @return The name.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSName createName(byte[] name, Oid nameType, Oid mech)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method to convert a contiguous string name from the specified
|
|
* namespace to a {@link GSSName} object. In general, the {@link GSSName}
|
|
* object created will not be an MN; two examples that are exceptions to
|
|
* this are when the namespace type parameter indicates {@link
|
|
* GSSName#NT_EXPORT_NAME} or when the GSS-API implementation is not
|
|
* multi-mechanism.
|
|
*
|
|
* @param nameStr The string representing a printable form of the name
|
|
* to create.
|
|
* @param nameType The Oid specifying the namespace of the printable name
|
|
* supplied. Note that nameType serves to describe and
|
|
* qualify the interpretation of the input nameStr, it
|
|
* does not necessarily imply a type for the output
|
|
* GSSName implementation. "null" value can be used to
|
|
* specify that a mechanism specific default printable
|
|
* syntax should be assumed by each mechanism that
|
|
* examines nameStr.
|
|
* @return The name.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSName createName(String nameStr, Oid nameType)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Factory method to convert a contiguous string name from the specified
|
|
* namespace to an GSSName object that is a mechanism name (MN). In
|
|
* other words, this method is a utility that does the equivalent of two
|
|
* steps: the {@link #createName(java.lang.String,org.ietf.jgss.Oid)}
|
|
* and then also {@link GSSName#canonicalize(org.ietf.jgss.Oid)}.
|
|
*
|
|
* @param nameStr The string representing a printable form of the name
|
|
* to create.
|
|
* @param nameType The Oid specifying the namespace of the printable name
|
|
* supplied. Note that nameType serves to describe and
|
|
* qualify the interpretation of the input nameStr, it
|
|
* does not necessarily imply a type for the output
|
|
* GSSName implementation. "null" value can be used to
|
|
* specify that a mechanism specific default printable
|
|
* syntax should be assumed when the mechanism examines
|
|
* nameStr.
|
|
* @param mech Oid specifying the mechanism for which this name
|
|
* should be created.
|
|
* @return The name.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract GSSName createName(String nameStr, Oid nameType, Oid mech)
|
|
throws GSSException;
|
|
|
|
/**
|
|
* Returns an array of {@link Oid} objects indicating mechanisms available
|
|
* to GSS-API callers. A <code>null</code> value is returned when no
|
|
* mechanism are available (an example of this would be when mechanism are
|
|
* dynamically configured, and currently no mechanisms are installed).
|
|
*
|
|
* @return The array of available mechanisms, or <code>null</code>.
|
|
*/
|
|
public abstract Oid[] getMechs();
|
|
|
|
/**
|
|
* Returns an array of {@link Oid} objects corresponding to the mechanisms
|
|
* that support the specific name type. <code>null</code> is returned when
|
|
* no mechanisms are found to support the specified name type.
|
|
*
|
|
* @param name The Oid object for the name type.
|
|
* @return The array of mechanisms, or <code>null</code>.
|
|
*/
|
|
public abstract Oid[] getMechsForName(Oid name);
|
|
|
|
/**
|
|
* Returns name type Oid's supported by the specified mechanism.
|
|
*
|
|
* @param mechanism The Oid object for the mechanism to query.
|
|
* @return The name type Oid's supported by the mechanism.
|
|
* @throws GSSException If this operation fails.
|
|
*/
|
|
public abstract Oid[] getNamesForMech(Oid mechanism) throws GSSException;
|
|
}
|