
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14336 ec53bebd-3082-4978-b11e-865c3cabbd6b
250 lines
8.4 KiB
Plaintext
250 lines
8.4 KiB
Plaintext
|
||
|
||
GSSAPI Java CSharp C. Morris
|
||
INTERNET-DRAFT Novell, Inc.
|
||
draft-morris-java-gssapi-update-for-csharp-00.txt comorris@novell.com
|
||
Expires 10 March 2004 July 2004
|
||
|
||
|
||
Generic Security Service API Version 2 : Java & C# Bindings
|
||
|
||
Status of this Memo
|
||
|
||
Comments should be submitted to comorris@novell.com.
|
||
|
||
By submitting this Internet-Draft, I certify that any applicable
|
||
patent or other IPR claims of which I am aware have been disclosed, or
|
||
will be disclosed, and any of which I become aware will be disclosed,
|
||
in accordance with RFC 3668.
|
||
|
||
Internet-Drafts are working documents of the Internet Engineering
|
||
Task Force (IETF), its areas, and its working groups. Note that other
|
||
groups may also distribute working documents as Internet-Drafts.
|
||
|
||
Internet-Drafts are draft documents valid for a maximum of six months
|
||
and may be updated, replaced, or obsoleted by other documents at any
|
||
time. It is inappropriate to use Internet-Drafts as reference
|
||
material or to cite them other than a "work in progress."
|
||
|
||
The list of current Internet-Drafts can be accessed at
|
||
http://www.ietf.org/1id-abstracts.html
|
||
|
||
The list of Internet-Draft Shadow Directories can be accessed at
|
||
http://www.ietf.org/shadow.html
|
||
|
||
Abstract
|
||
|
||
The Generic Security Services Application Program Interface (GSS-API)
|
||
offers application programmers uniform access to security services
|
||
atop a variety of underlying cryptographic mechanisms. This document
|
||
proposes an update to RFC 2853, Generic Security Service API Version
|
||
2 : Java Bindings, to include C# bindings.
|
||
|
||
4.17. C# Modifications
|
||
|
||
This section describes the language dependent modifications necessary
|
||
to implement the interface in C#.
|
||
|
||
4.17.1 C# Assembly Name
|
||
|
||
The C# namespace is org.ietf.gss. See section 4.17.5 for an example.
|
||
|
||
4.17.2 C# Class Definitions
|
||
|
||
All class definitions & methods remain the same as specified in the
|
||
Java bindings.
|
||
|
||
4.17.3 C# Data Types
|
||
|
||
All data types remain the same.
|
||
|
||
4.17.4 C# Exception Handling
|
||
|
||
All exception codes remain the same as specified in the Java bindings.
|
||
However, C# does not have a 'throws' statement. Therefore, method prototypes do
|
||
not include the exception type. For example,
|
||
|
||
Java method prototype :
|
||
|
||
public abstract GSSName createName(String nameStr, Oid nameType)
|
||
throws GSSException;
|
||
|
||
Equivalent C# method prototype :
|
||
|
||
public abstract GSSName createName(String nameStr, Oid nameType);
|
||
|
||
C# does implement the throw and catch keywords, for example:
|
||
|
||
public class GSSName createName(String nameStr, Oid nameType)
|
||
{
|
||
int majorCode = 0;
|
||
...
|
||
|
||
majorCode = validateParms(nameStr, nameType);
|
||
|
||
if (majorCode)
|
||
throw new GSSException(majorCode);
|
||
|
||
...
|
||
}
|
||
|
||
|
||
4.17.5 C# Example Code
|
||
|
||
Client example :
|
||
|
||
using ietf.org.gss;
|
||
|
||
class GssapiClient
|
||
{
|
||
private static TcpClient client;
|
||
private static NetworkStream stream;
|
||
|
||
static void Main(string[] args)
|
||
{
|
||
Connect("127.0.0.1", "message from client");
|
||
|
||
try
|
||
{
|
||
GSSManager manager = GSSManager.getInstance();
|
||
|
||
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
|
||
Oid krb5PrincipalNameType = new Oid("1.2.840.113554.1.2.2.1");
|
||
|
||
// Optionally Identify who the client wishes to be
|
||
// GSSName name = manager.createName("test@gsserver", GSSName.NT_USER_NAME);
|
||
|
||
// Obtain default credential
|
||
GSSCredential userCreds = manager.createCredential(GSSCredential.INITIATE_ONLY);
|
||
GSSName name = userCreds.getName(krb5PrincipalNameType);
|
||
|
||
Console.WriteLine("Just acquired credentials for " + name.toString());
|
||
|
||
int acceptLife = userCreds.getRemainingAcceptLifetime(new Oid("2.3.4"));
|
||
int initLife = userCreds.getRemainingInitLifetime(new Oid("1..3."));
|
||
int remLife = userCreds.getRemainingLifetime();
|
||
int usage = userCreds.getUsage();
|
||
|
||
GSSName namea = userCreds.getName();
|
||
Oid[] oa = userCreds.getMechs();
|
||
|
||
// Instantiate and initialize a security context that will be
|
||
// established with the server
|
||
GSSContext context = manager.createContext(name,
|
||
krb5Mechanism,
|
||
userCreds,
|
||
GSSContext.DEFAULT_LIFETIME);
|
||
|
||
userCreds.dispose();
|
||
|
||
// Optionally Set Context Options, must be done before iniSecContext call
|
||
context.requestMutualAuth(true);
|
||
context.requestConf(true);
|
||
context.requestInteg(true);
|
||
context.requestSequenceDet(true);
|
||
context.requestCredDeleg(true);
|
||
|
||
MemoryStream ins = new MemoryStream();
|
||
MemoryStream outs = new MemoryStream();
|
||
|
||
// loop until context is setup and no more tokens to receive
|
||
while (!context.isEstablished())
|
||
{
|
||
outs = new MemoryStream();
|
||
context.initSecContext(ins, outs);
|
||
|
||
// send token if present
|
||
if (outs.Length > 0)
|
||
{
|
||
Console.WriteLine("Sending token...");
|
||
sendToken(outs);
|
||
}
|
||
|
||
// check if we should expect more tokens
|
||
if (context.isEstablished())
|
||
break;
|
||
|
||
// another token expected from peer
|
||
Console.WriteLine("Still expecting another token from server...");
|
||
ins = recvToken();
|
||
}
|
||
|
||
//
|
||
// display context information
|
||
//
|
||
|
||
// Did the server authenticate back to client?
|
||
Console.WriteLine("\n{0} Mutual Authentication",
|
||
context.getMutualAuthState() ? "Using" : "Not using");
|
||
Console.WriteLine("Credentials were delegated = "
|
||
+ context.getCredDelegState());
|
||
Console.WriteLine("Remaining lifetime in seconds = "
|
||
+ context.getLifetime());
|
||
Console.WriteLine("Context mechanism = " + context.getMech());
|
||
Console.WriteLine("Initiator = " + context.getSrcName().toString());
|
||
Console.WriteLine("Acceptor = " + context.getTargName().toString());
|
||
Console.WriteLine("Confidentiality (i.e., privacy) is {0}available",
|
||
context.getConfState() ? "" : "not ");
|
||
Console.WriteLine("Integrity is {0}available",
|
||
context.getIntegState() ? "" : "not ");
|
||
Console.WriteLine("Is initiator = " + context.isInitiator());
|
||
Console.WriteLine("Is transferable = " + context.isTransferable());
|
||
Console.WriteLine("Is protReady = " + context.isProtReady());
|
||
Console.WriteLine("ReplayDetState = " +
|
||
context.getReplayDetState());
|
||
Console.WriteLine("SequenceDetState = " +
|
||
context.getSequenceDetState());
|
||
|
||
// perform wrap on an application supplied message
|
||
// using QOP = 0, and requesting privacy service
|
||
|
||
MessageProp msgProp = new MessageProp(0, true);
|
||
byte [] message = System.Text.Encoding.ASCII.GetBytes("Hello GSS-API!");
|
||
byte [] token = System.Text.Encoding.ASCII.GetBytes("tok");
|
||
|
||
// Byte aray method is equivalent to stream method
|
||
//byte []token = context.wrap(message, 0, appMsg.length, msgProp);
|
||
//sendToken(token);
|
||
|
||
ins = new MemoryStream();
|
||
outs = new MemoryStream();
|
||
ins.Write(token, 0, token.Length);
|
||
context.getMIC(ins, outs, msgProp);
|
||
sendToken(outs);
|
||
|
||
outs = new MemoryStream();
|
||
outs.Write(message, 0, message.Length);
|
||
sendToken(outs);
|
||
|
||
ins = new MemoryStream();
|
||
outs = new MemoryStream();
|
||
ins.Write(message, 0, message.Length);
|
||
context.wrap(ins, outs, msgProp);
|
||
sendToken(outs);
|
||
|
||
// Optionally export context to another thead
|
||
GSSContext ctx = manager.createContext(context.export());
|
||
Console.WriteLine("New context isTransferable = " + ctx.isTransferable());
|
||
Console.WriteLine("New context isInitiator = " +ctx.isInitiator());
|
||
Console.WriteLine("New context protReady = " +ctx.isProtReady());
|
||
Console.WriteLine("New context srcName = " +ctx.getSrcName().toString());
|
||
Console.WriteLine("New context targName = " +ctx.getTargName().toString());
|
||
|
||
// release the local-end of the context
|
||
ctx.dispose();
|
||
|
||
stream.Close();
|
||
Console.WriteLine("Leaving...");
|
||
}
|
||
catch (GSSException e)
|
||
{
|
||
Console.WriteLine(e.getMessage());
|
||
Console.WriteLine(e.StackTrace);
|
||
}
|
||
}
|
||
|
||
|
||
Expires 10 March 2004
|
||
|
||
|