Skip Navigation Links | |
Exit Print View | |
Developer's Guide to Oracle Solaris 11 Security Oracle Solaris 11.1 Information Library |
1. Oracle Solaris Security for Developers (Overview)
2. Developing Privileged Applications
3. Writing PAM Applications and Services
4. Writing Applications That Use GSS-API
7. Writing Applications That Use SASL
Introduction to Simple Authentication Security Layer (SASL)
SASL Confidentiality and Integrity
Important Structures for SASL Plug-ins
User Canonicalization Plug-ins
Auxiliary Property (auxprop) Plug-ins
SASL Plug-in Development Guidelines
Error Reporting in SASL Plug-ins
Memory Allocation in SASL Plug-ins
Setting the SASL Negotiation Sequence
8. Introduction to the Oracle Solaris Cryptographic Framework
9. Writing User-Level Cryptographic Applications
10. Introduction to the Oracle Solaris Key Management Framework
A. Secure Coding Guidelines for Developers
B. Sample C-Based GSS-API Programs
This section demonstrates a typical SASL session between a client application and server application. The example goes through these steps:
The client application initializes libsasl.
The client application sets the following global callbacks:
SASL_CB_GETREALM
SASL_CB_USER
SASL_CB_AUTHNAME
SASL_CB_PASS
SASL_CB_GETPATH
SASL_CB_LIST_END
The server application initializes libsasl.
The server application sets the following global callbacks:
SASL_CB_LOG
SASL_CB_LIST_END
The client creates a SASL connection context, sets the security properties, and requests the list of available mechanisms from the server.
The server creates a SASL connection context, sets the security properties, gets a list of suitable SASL mechanisms, and sends the list to client.
The client receives the list of available mechanisms, chooses a mechanism, and sends the mechanism choice to the server together with any authentication data.
The client and server then exchange SASL data until the authentication and security layer negotiation is complete.
With the authentication complete, the client and server determine whether a security layer was negotiated. The client encodes a test message. The message is then sent to the server. The server also determines the user name of the authenticated user and the user's realm.
The server receives, decodes, and prints the encoded message.
The client calls sasl_dispose() to release the client's SASL connection context. The client then calls sasl_done() to release the libsasl resources.
The server calls sasl_dispose() to release the client connection context.
The dialogue between the client and the server follows. Each call to libsasl is displayed as the call is made. Each transfer of data is indicated by the sender and receiver. The data is displayed in encoded form preceded by the source: C: for the client and S:for server. The source code for both applications is provided in the Appendix E, Source Code for SASL Example.
% doc-sample-client *** Calling sasl_client_init() to initialize libsasl for client use *** *** Calling sasl_client_new() to create client SASL connection context *** *** Calling sasl_setprop() to set sasl context security properties *** Waiting for mechanism list from server...
% doc-sample-server digest-md5 *** Calling sasl_server_init() to initialize libsasl for server use *** *** Calling sasl_server_new() to create server SASL connection context *** *** Calling sasl_setprop() to set sasl context security properties *** Forcing use of mechanism digest-md5 Sending list of 1 mechanism(s) S: ZGlnZXN0LW1kNQ==
S: ZGlnZXN0LW1kNQ== received 10 byte message got 'digest-md5' Choosing best mechanism from: digest-md5 *** Calling sasl_client_start() *** Using mechanism DIGEST-MD5 Sending initial response... C: RElHRVNULU1ENQ== Waiting for server reply...
C: RElHRVNULU1ENQ== got 'DIGEST-MD5' *** Calling sasl_server_start() *** Sending response... S: bm9uY2U9IklicGxhRHJZNE4Z1gyVm5lQzl5MTZOYWxUOVcvanUrcmp5YmRqaHM\ sbT0iam0xMTQxNDIiLHFvcD0iYXV0aCxhdXRoLWludCxhdXRoLWNvbmYiLGNpcGhlcj0ic\ QwLHJjNC01NixyYzQiLG1heGJ1Zj0yMDQ4LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1k\ XNz Waiting for client reply...
S: bm9uY2U9IklicGxhRHJZNE4Z1gyVm5lQzl5MTZOYWxUOVcvanUrcmp5YmRqaHM\ sbT0iam0xMTQxNDIiLHFvcD0iYXV0aCxhdXRoLWludCxhdXRoLWNvbmYiLGNpcGhlcj0ic\ QwLHJjNC01NixyYzQiLG1heGJ1Zj0yMDQ4LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1k\ XNz received 171 byte message got 'nonce="IbplaDrY4N4szhgX2VneC9y16NalT9W/ju+rjybdjhs=",\ realm="jm114142",qop="auth,auth-int,auth-conf",cipher="rc4-40,rc4-56,\ rc4",maxbuf=2048,charset=utf-8,algorithm=md5-sess' *** Calling sasl_client_step() *** Please enter your authorization name : zzzz Please enter your authentication name : zzzz Please enter your password : zz *** Calling sasl_client_step() *** Sending response... C: dXNlcm5hbWU9Inp6enoiLHJlYWxtPSJqbTExNDE0MiIsbm9uY2U9IklicGxhRHJZNE4\ yVm5lQzl5MTZOYWxUOVcvanUrcmp5YmRqaHM9Iixjbm9uY2U9InlqZ2hMVmhjRFJMa0Fob\ tDS0p2WVUxMUM4V1NycjJVWm5IR2Vkclk9IixuYz0wMDAwMDAwMSxxb3A9YXV0aC1jb25m\ Ghlcj0icmM0IixtYXhidWY9MjA0OCxkaWdlc3QtdXJpPSJyY21kLyIscmVzcG9uc2U9OTY\ ODI1MmRmNzY4YTJjYzkxYjJjZDMyYTk0ZWM= Waiting for server reply...
C: dXNlcm5hbWU9Inp6enoiLHJlYWxtPSJqbTExNDE0MiIsbm9uY2U9IklicGxhRHJZNE4\ yVm5lQzl5MTZOYWxUOVcvanUrcmp5YmRqaHM9Iixjbm9uY2U9InlqZ2hMVmhjRFJMa0Fob\ tDS0p2WVUxMUM4V1NycjJVWm5IR2Vkclk9IixuYz0wMDAwMDAwMSxxb3A9YXV0aC1jb25m\ Ghlcj0icmM0IixtYXhidWY9MjA0OCxkaWdlc3QtdXJpPSJyY21kLyIscmVzcG9uc2U9OTY\ ODI1MmRmNzY4YTJjYzkxYjJjZDMyYTk0ZWM= got 'username="zzzz",realm="jm114142",\ nonce="IbplaDrY4N4szhgX2VneC9y16NalT9W/ju+rjybdjhs=",\ cnonce="yjghLVhcDRLkAhoirwKCKJvYU11C8WSrr2UZnHGedrY=", \ nc=00000001,qop=auth-conf,cipher="rc4",maxbuf=2048,digest-uri="rcmd/",\ response=966e978252df768a2cc91b2cd32a94ec' *** Calling sasl_server_step() *** Sending response... S: cnNwYXV0aD0yYjEzMzRjYzU4NTE4MTEwOWM3OTdhMjUwYjkwMzk3OQ== Waiting for client reply...
S: cnNwYXV0aD0yYjEzMzRjYzU4NTE4MTEwOWM3OTdhMjUwYjkwMzk3OQ== received 40 byte message got 'rspauth=2b1334cc585181109c797a250b903979' *** Calling sasl_client_step() *** C: Negotiation complete *** Calling sasl_getprop() *** Username: zzzz SSF: 128 Waiting for encoded message...
Waiting for client reply... C: got '' *** Calling sasl_server_step() *** Negotiation complete *** Calling sasl_getprop() to get username, realm, ssf *** Username: zzzz Realm: 22c38 SSF: 128 *** Calling sasl_encode() *** sending encrypted message 'srv message 1' S: AAAAHvArjnAvDFuMBqAAxkqdumzJB6VD1oajiwABAAAAAA==
S: AAAAHvArjnAvDFuMBqAAxkqdumzJB6VD1oajiwABAAAAAA== received 34 byte message got '' *** Calling sasl_decode() *** received decoded message 'srv message 1' *** Calling sasl_encode() *** sending encrypted message 'client message 1' C: AAAAIRdkTEMYOn9X4NXkxPc3OTFvAZUnLbZANqzn6gABAAAAAA== *** Calling sasl_dispose() to release client SASL connection context *** *** Calling sasl_done() to release libsasl resources ***
Waiting for encrypted message... C: AAAAIRdkTEMYOn9X4NXkxPc3OTFvAZUnLbZANqzn6gABAAAAAA== got '' *** Calling sasl_decode() *** received decoded message 'client message 1' *** Calling sasl_dispose() to release client SASL connection context ***