Ensure data structures allocated by hprop are initialized
[heimdal.git] / doc / standardisation / draft-morris-java-gssapi-update-for-csharp-00.txt
blobd65d8fb0890244a8e4d53d015e6a3e0f5d47dcdd
3 GSSAPI Java CSharp                                             C. Morris
4 INTERNET-DRAFT                                               Novell, Inc.
5 draft-morris-java-gssapi-update-for-csharp-00.txt     comorris@novell.com
6 Expires 10 March 2004                                           July 2004
9          Generic Security Service API Version 2 : Java & C# Bindings
11 Status of this Memo
13    Comments should be submitted to comorris@novell.com.
15    By submitting this Internet-Draft, I certify that any applicable
16    patent or other IPR claims of which I am aware have been disclosed, or
17    will be disclosed, and any of which I become aware will be disclosed,
18    in accordance with RFC 3668.
20    Internet-Drafts are working documents of the Internet Engineering
21    Task Force (IETF), its areas, and its working groups.  Note that other
22    groups may also distribute working documents as Internet-Drafts.
24    Internet-Drafts are draft documents valid for a maximum of six months
25    and may be updated, replaced, or obsoleted by other documents at any
26    time.  It is inappropriate to use Internet-Drafts as reference
27    material or to cite them other than a "work in progress."
29    The list of current Internet-Drafts can be accessed at
30    http://www.ietf.org/1id-abstracts.html
32    The list of Internet-Draft Shadow Directories can be accessed at
33    http://www.ietf.org/shadow.html
35 Abstract
37    The Generic Security Services Application Program Interface (GSS-API)
38    offers application programmers uniform access to security services
39    atop a variety of underlying cryptographic mechanisms. This document
40    proposes an update to RFC 2853, Generic Security Service API Version 
41    2 : Java Bindings, to include C# bindings.
43 4.17.  C# Modifications
45    This section describes the language dependent modifications necessary
46    to implement the interface in C#. 
47    
48 4.17.1   C# Assembly Name
50    The C# namespace is org.ietf.gss. See section 4.17.5 for an example.
51    
52 4.17.2   C# Class Definitions
53    
54    All class definitions & methods remain the same as specified in the 
55    Java bindings.
56    
57 4.17.3   C# Data Types
59    All data types remain the same.
61 4.17.4   C# Exception Handling
63    All exception codes remain the same as specified in the Java bindings.
64    However, C# does not have a 'throws' statement. Therefore, method prototypes do
65    not include the exception type. For example,
66    
67    Java method prototype :
68    
69       public abstract GSSName createName(String nameStr, Oid nameType)
70          throws GSSException;
71   
72    Equivalent C# method prototype :
73   
74       public abstract GSSName createName(String nameStr, Oid nameType);
75     
76    C# does implement the throw and catch keywords, for example:
77    
78       public class GSSName createName(String nameStr, Oid nameType)
79       {
80          int majorCode = 0;
81          ...
82          
83          majorCode = validateParms(nameStr, nameType);
84          
85          if (majorCode)
86             throw new GSSException(majorCode);
87             
88          ...
89       }
92 4.17.5   C# Example Code
94    Client example : 
95    
96    using ietf.org.gss;
98    class GssapiClient
99    {
100       private static TcpClient client;
101       private static NetworkStream stream;
103            static void Main(string[] args)
104            {
105                    Connect("127.0.0.1", "message from client");
107            try
108            {
109               GSSManager manager = GSSManager.getInstance();
111               Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
112               Oid krb5PrincipalNameType = new Oid("1.2.840.113554.1.2.2.1");
114               // Optionally Identify who the client wishes to be
115               // GSSName name = manager.createName("test@gsserver", GSSName.NT_USER_NAME);
116         
117               // Obtain default credential
118               GSSCredential userCreds = manager.createCredential(GSSCredential.INITIATE_ONLY);
119               GSSName name = userCreds.getName(krb5PrincipalNameType);
121               Console.WriteLine("Just acquired credentials for " + name.toString());
123               int acceptLife = userCreds.getRemainingAcceptLifetime(new Oid("2.3.4"));
124               int initLife   = userCreds.getRemainingInitLifetime(new Oid("1..3."));
125               int remLife    = userCreds.getRemainingLifetime();
126               int usage      = userCreds.getUsage();
127            
128               GSSName namea = userCreds.getName();
129               Oid[] oa = userCreds.getMechs();
131          // Instantiate and initialize a security context that will be
132          // established with the server
133               GSSContext context = manager.createContext(name,
134                                                       krb5Mechanism,
135                                                       userCreds,
136                                                       GSSContext.DEFAULT_LIFETIME);
138               userCreds.dispose();
140               // Optionally Set Context Options, must be done before iniSecContext call
141               context.requestMutualAuth(true);
142               context.requestConf(true);
143               context.requestInteg(true);
144               context.requestSequenceDet(true);
145               context.requestCredDeleg(true);
147               MemoryStream ins = new MemoryStream();
148               MemoryStream outs = new MemoryStream();
150               // loop until context is setup and no more tokens to receive
151               while (!context.isEstablished())
152               {
153               outs = new MemoryStream();
154                  context.initSecContext(ins, outs);
156                  // send token if present
157                  if (outs.Length > 0)
158                  {
159                          Console.WriteLine("Sending token...");
160                          sendToken(outs);
161                  }
163                  // check if we should expect more tokens
164                  if (context.isEstablished())
165                          break;
167                  // another token expected from peer
168                  Console.WriteLine("Still expecting another token from server...");
169                  ins = recvToken();
170               }
172               //
173               // display context information
174               //
176               // Did the server authenticate back to client?
177               Console.WriteLine("\n{0} Mutual Authentication", 
178               context.getMutualAuthState() ? "Using" : "Not using");
179               Console.WriteLine("Credentials were delegated = " 
180               + context.getCredDelegState());
181               Console.WriteLine("Remaining lifetime in seconds = " 
182                  + context.getLifetime());
183               Console.WriteLine("Context mechanism = " + context.getMech());
184               Console.WriteLine("Initiator = " + context.getSrcName().toString());
185               Console.WriteLine("Acceptor = " + context.getTargName().toString());
186               Console.WriteLine("Confidentiality (i.e., privacy) is {0}available", 
187               context.getConfState() ? "" : "not ");
188               Console.WriteLine("Integrity is {0}available", 
189               context.getIntegState() ? "" : "not ");
190               Console.WriteLine("Is initiator = " + context.isInitiator());
191               Console.WriteLine("Is transferable = " + context.isTransferable());
192               Console.WriteLine("Is protReady = " + context.isProtReady());
193               Console.WriteLine("ReplayDetState = " + 
194               context.getReplayDetState());
195               Console.WriteLine("SequenceDetState = " + 
196               context.getSequenceDetState());
198               // perform wrap on an application supplied message
199               // using QOP = 0, and requesting privacy service
201               MessageProp msgProp = new MessageProp(0, true);
202               byte [] message = System.Text.Encoding.ASCII.GetBytes("Hello GSS-API!");
203               byte [] token = System.Text.Encoding.ASCII.GetBytes("tok");
205               // Byte aray method is equivalent to stream method
206               //byte []token = context.wrap(message, 0, appMsg.length, msgProp);
207               //sendToken(token);
209               ins = new MemoryStream();
210               outs = new MemoryStream();
211               ins.Write(token, 0, token.Length);
212               context.getMIC(ins, outs, msgProp);
213               sendToken(outs);
215               outs = new MemoryStream();
216               outs.Write(message, 0, message.Length);
217               sendToken(outs);
219               ins = new MemoryStream();
220               outs = new MemoryStream();
221               ins.Write(message, 0, message.Length);
222               context.wrap(ins, outs, msgProp);
223               sendToken(outs);
225          // Optionally export context to another thead
226               GSSContext ctx = manager.createContext(context.export());
227               Console.WriteLine("New context isTransferable = " + ctx.isTransferable());
228               Console.WriteLine("New context isInitiator = " +ctx.isInitiator());
229               Console.WriteLine("New context protReady = " +ctx.isProtReady());
230               Console.WriteLine("New context srcName = " +ctx.getSrcName().toString());
231               Console.WriteLine("New context targName = " +ctx.getTargName().toString());
233               // release the local-end of the context
234               ctx.dispose();
236               stream.Close();
237               Console.WriteLine("Leaving...");
238            }
239            catch (GSSException e)
240            {
241               Console.WriteLine(e.getMessage());
242               Console.WriteLine(e.StackTrace);
243            }
244         }
247 Expires 10 March 2004