1 2 3GSSAPI Java CSharp C. Morris 4INTERNET-DRAFT Novell, Inc. 5draft-morris-java-gssapi-update-for-csharp-00.txt comorris@novell.com 6Expires 10 March 2004 July 2004 7 8 9 Generic Security Service API Version 2 : Java & C# Bindings 10 11Status of this Memo 12 13 Comments should be submitted to comorris@novell.com. 14 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. 19 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. 23 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." 28 29 The list of current Internet-Drafts can be accessed at 30 http://www.ietf.org/1id-abstracts.html 31 32 The list of Internet-Draft Shadow Directories can be accessed at 33 http://www.ietf.org/shadow.html 34 35Abstract 36 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. 42 434.17. C# Modifications 44 45 This section describes the language dependent modifications necessary 46 to implement the interface in C#. 47 484.17.1 C# Assembly Name 49 50 The C# namespace is org.ietf.gss. See section 4.17.5 for an example. 51 524.17.2 C# Class Definitions 53 54 All class definitions & methods remain the same as specified in the 55 Java bindings. 56 574.17.3 C# Data Types 58 59 All data types remain the same. 60 614.17.4 C# Exception Handling 62 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 } 90 91 924.17.5 C# Example Code 93 94 Client example : 95 96 using ietf.org.gss; 97 98 class GssapiClient 99 { 100 private static TcpClient client; 101 private static NetworkStream stream; 102 103 static void Main(string[] args) 104 { 105 Connect("127.0.0.1", "message from client"); 106 107 try 108 { 109 GSSManager manager = GSSManager.getInstance(); 110 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"); 113 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); 120 121 Console.WriteLine("Just acquired credentials for " + name.toString()); 122 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(); 130 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); 137 138 userCreds.dispose(); 139 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); 146 147 MemoryStream ins = new MemoryStream(); 148 MemoryStream outs = new MemoryStream(); 149 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); 155 156 // send token if present 157 if (outs.Length > 0) 158 { 159 Console.WriteLine("Sending token..."); 160 sendToken(outs); 161 } 162 163 // check if we should expect more tokens 164 if (context.isEstablished()) 165 break; 166 167 // another token expected from peer 168 Console.WriteLine("Still expecting another token from server..."); 169 ins = recvToken(); 170 } 171 172 // 173 // display context information 174 // 175 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()); 197 198 // perform wrap on an application supplied message 199 // using QOP = 0, and requesting privacy service 200 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"); 204 205 // Byte aray method is equivalent to stream method 206 //byte []token = context.wrap(message, 0, appMsg.length, msgProp); 207 //sendToken(token); 208 209 ins = new MemoryStream(); 210 outs = new MemoryStream(); 211 ins.Write(token, 0, token.Length); 212 context.getMIC(ins, outs, msgProp); 213 sendToken(outs); 214 215 outs = new MemoryStream(); 216 outs.Write(message, 0, message.Length); 217 sendToken(outs); 218 219 ins = new MemoryStream(); 220 outs = new MemoryStream(); 221 ins.Write(message, 0, message.Length); 222 context.wrap(ins, outs, msgProp); 223 sendToken(outs); 224 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()); 232 233 // release the local-end of the context 234 ctx.dispose(); 235 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 } 245 246 247Expires 10 March 2004 248 249 250