<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BenKaduk</id>
		<title>K5Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BenKaduk"/>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki/Special:Contributions/BenKaduk"/>
		<updated>2026-05-14T16:18:44Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=5484</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=5484"/>
				<updated>2015-06-25T22:04:56Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: List the steps involved in building the official release binaries&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP/IMAP via Thunderbird (must disable SSPI though?)&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP via, e.g., Pidgin&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
The NSIS upgrade path is a separate codepath and should be tested separately.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls no longer reflects the underlying krb5 version (instead using the KfW version); this may not actually be a bug.&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* (Version) upgrades that go from 64-bit to 32-bit leave 64-bit binaries around but otherwise succeed.&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth unless you disable SSPI&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedure for building release binaries (MIT and non-MIT, i386 and amd64):&lt;br /&gt;
&lt;br /&gt;
   On the VM host:&lt;br /&gt;
   &lt;br /&gt;
   rm -rf /path/to/share/kfw-4.1-beta2 &amp;amp;&amp;amp; git archive --prefix=kfw-4.1-beta2/ [committish] | (cd /path/to/share/; tar x)&lt;br /&gt;
   rm -rf /path/to/share/kfw-4.1-beta2-mit &amp;amp;&amp;amp; git archive --prefix=kfw-4.1-beta2-mit/ [committish] | (cd /path/to/share/; tar x)&lt;br /&gt;
   git archive --prefix=kfw-4.1-beta2/ --format=zip -o ../kfw-4.1-beta2-src.zip refs/tags/kfw-4.1-beta2&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   mkdir C:\destdir&lt;br /&gt;
   mkdir C:\debug-symbols&lt;br /&gt;
   mkdir C:\debug-symbols\kfw-NNN-i386-mit&lt;br /&gt;
   mkdir C:\debug-symbols\kfw-NNN-amd64-mit&lt;br /&gt;
   mkdir C:\debug-symbols\kfw-NNN-i386&lt;br /&gt;
   mkdir C:\debug-symbols\kfw-NNN-amd64&lt;br /&gt;
   setenv /x86 /release&lt;br /&gt;
   set CPU=i386&lt;br /&gt;
   set KRB_INSTALL_DIR=C:\destdir&lt;br /&gt;
   set NODEBUG=1&lt;br /&gt;
   set DEBUG_SYMBOL=1&lt;br /&gt;
   set MIT_INTERNAL=1&lt;br /&gt;
   # do the MIT i386 build&lt;br /&gt;
   cd C:\kfw-NNN-mit\src&lt;br /&gt;
   nmake -f Makefile.in prep-windows&lt;br /&gt;
   nmake&lt;br /&gt;
   nmake install&lt;br /&gt;
   set DEBUG_SYMBOL=	# unset it&lt;br /&gt;
   mv C:\destdir\bin\*.pdb C:\debug-symbols\kfw-NNN-i386-mit&lt;br /&gt;
   cd windows\installer\wix&lt;br /&gt;
   nmake&lt;br /&gt;
   rename kfw.msi kfw-NNN-i386-mit.msi&lt;br /&gt;
   # time for the MIT amd64 build&lt;br /&gt;
   cd ..\..\..&lt;br /&gt;
   setenv /x64 /release&lt;br /&gt;
   set CPU=AMD64&lt;br /&gt;
   set DEBUG_SYMBOL=1&lt;br /&gt;
   nmake clean&lt;br /&gt;
   nmake&lt;br /&gt;
   nmake install&lt;br /&gt;
   set DEBUG_SYMBOL=	# unset it&lt;br /&gt;
   mv C:\destdir\bin\*.pdb C:\debug-symbols\kfw-NNN-amd64-mit&lt;br /&gt;
   cd windows\installer\wix&lt;br /&gt;
   nmake clean&lt;br /&gt;
   nmake&lt;br /&gt;
   rename kfw.msi kfw-NNN-amd64-mit.msi&lt;br /&gt;
   rm -r C:\destdir\bin&lt;br /&gt;
   rm -r C:\destdir\lib&lt;br /&gt;
   rm -r C:\destdir\include&lt;br /&gt;
   # fresh env for the non-MIT i386 build&lt;br /&gt;
   setenv /x86 /release&lt;br /&gt;
   set CPU=i386&lt;br /&gt;
   set DEBUG_SYMBOL=1&lt;br /&gt;
   set MIT_INTERNAL=	# unset it&lt;br /&gt;
   cd C:\kfw-NNN\src&lt;br /&gt;
   nmake -f Makefile.in prep-windows&lt;br /&gt;
   nmake&lt;br /&gt;
   nmake install&lt;br /&gt;
   set DEBUG_SYMBOL=	# unset it&lt;br /&gt;
   mv C:\destdir\bin\*.pdb C:\debug-symbols\kfw-NNN-i386&lt;br /&gt;
   cd windows\installer\wix&lt;br /&gt;
   nmake&lt;br /&gt;
   rename kfw.msi kfw-NNN-i386.msi&lt;br /&gt;
   cd ..\..\..&lt;br /&gt;
   # the non-MIT amd64 build&lt;br /&gt;
   setenv /x64 /release&lt;br /&gt;
   set CPU=AMD64&lt;br /&gt;
   set DEBUG_SYMBOL=1&lt;br /&gt;
   nmake clean&lt;br /&gt;
   nmake&lt;br /&gt;
   nmake install&lt;br /&gt;
   set DEBUG_SYMBOL=	# unset it&lt;br /&gt;
   mv C:\destdir\bin\*.pdb C:\debug-symbols\kfw-NNN-amd64&lt;br /&gt;
   cd windows\installer\wix&lt;br /&gt;
   nmake clean&lt;br /&gt;
   nmake&lt;br /&gt;
   rename kfw.msi kfw-NNN-amd64.msi&lt;br /&gt;
   [copy C:\kfw-NNN{,-mit}\src\windows\installer\wix\*.msi to the shared drive]&lt;br /&gt;
   [recursively copy C:\debug-symbols\kfw-NNN* to the shared drive]&lt;br /&gt;
   &lt;br /&gt;
   On the VM host, extract the build output for signing.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5256</id>
		<title>Projects/White Papers</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5256"/>
				<updated>2013-12-12T17:25:53Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: /* Summary of topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To codify in a single place assembled knowledge about the architecture of Kerberos, design considerations/assumptions and how these are present/different in real-world-environments, best practice for operational issues regarding Kerberos, and more.&lt;br /&gt;
&lt;br /&gt;
== Summary of topics ==&lt;br /&gt;
&lt;br /&gt;
List here topics or potential topics for white papers.  Individual papers may have an outline fleshed out as a separate section.&lt;br /&gt;
&lt;br /&gt;
* Revisiting the design assumptions that went into Kerberos' creation and analyzing their current validity&lt;br /&gt;
* Revisiting the Kerberos threat model (from Kerberos' creation) and analyzing present-day weaknesses, possibly with emphasis on preauthentication schemes&lt;br /&gt;
* Operational issues of relevance to running a KDC on the open internet&lt;br /&gt;
* (category, not necessarily a single paper) Discussion of particular enctype(s), known attacks on their ciphers/hashes, and their relevance to Kerberos&lt;br /&gt;
* What could &amp;quot;kerberos in the cloud&amp;quot; mean?  Is there such a concept which is useful?&lt;br /&gt;
* Use cases for PKINIT&lt;br /&gt;
* Use cases for anonymous PKINIT&lt;br /&gt;
* Use cases for anonymous tickets (both realm-anonymous and fully-anonymous)&lt;br /&gt;
* Security benefits of the https proxy, and how it compares to FAST with anonmyous PKINIT&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Improve_GSSAPI_mechanism_configuration&amp;diff=5238</id>
		<title>Projects/Improve GSSAPI mechanism configuration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Improve_GSSAPI_mechanism_configuration&amp;diff=5238"/>
				<updated>2013-10-18T19:44:30Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: spell 'each' correctly&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
{{project-target|1.13}}&lt;br /&gt;
&lt;br /&gt;
==Requirements and scope==&lt;br /&gt;
&lt;br /&gt;
The GSSAPI mechglue allows the installation of additional mechanisms, these mechanisms are currently sourced from the file /etc/gss/mech at library load time.&lt;br /&gt;
&lt;br /&gt;
In order to improve management of additional mechanism as separate packages for distributions it would be easier if each package could drop a configuration fragment in a separate file to activate a new installed plugin instead of changing a signle configuration file.&lt;br /&gt;
&lt;br /&gt;
==Design==&lt;br /&gt;
&lt;br /&gt;
A new directory owned by the GSSAPI library is created in /etc/gss/mech.d&lt;br /&gt;
In this directory packages can drop configuration fragments that use the exact same configuration format of the current /etc/gss/mech file.&lt;br /&gt;
&lt;br /&gt;
After the main /etc/gss/mech file has been parsed, any file in this directory is opened and parsed to find additional mechanisms to load.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5234</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5234"/>
				<updated>2013-10-11T21:20:54Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Make the list of information available to plugin authors match reality&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
We consider events under the categorization of the Common Criteria Class FIA.&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. The bulk of the audit information will be produced while processing AS and TGS requests.  Though KDC request processing can be grouped into several logical phases, we generate (usually) only two events, one at the initial receipt of a request, and a second, final, one before sending a reply.  All events relating to the same request can be linked together in the audit log by a 32-character alphanumeric string (about 190 bits of uniqueness) which is randomly generated at the start of processing.  If the request is a S4U2Self or S4U2Proxy request, an additional audit event will be generated with information particular to the S4U request.  The following table lists the logical stages of KDC processing, and which components are logged in the AS and TGS cases:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following information will be made available to audit plugins:&lt;br /&gt;
&lt;br /&gt;
: a unique request ID&lt;br /&gt;
: the complete KDC request structure&lt;br /&gt;
: the KDC reply structure (possibly only partially populated)&lt;br /&gt;
: the client's IP address and port number&lt;br /&gt;
: the stage of KDC processing at which the audit event was triggered&lt;br /&gt;
: the KDC status string (as appears in kdc.log)&lt;br /&gt;
: ticket IDs (checksums) for any supplied tickets or ticket to be returned&lt;br /&gt;
: the remote client's realm (for referrals)&lt;br /&gt;
: the impersonated user for an S4U2Self request&lt;br /&gt;
: the &amp;quot;type of violation&amp;quot; which caused the request to fail, if applicable&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Further details about policy viloations&lt;br /&gt;
:Event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term key creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5233</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5233"/>
				<updated>2013-10-11T21:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: update the intro for the events section, listing contents to be updated in a later change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
We consider events under the categorization of the Common Criteria Class FIA.&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. The bulk of the audit information will be produced while processing AS and TGS requests.  Though KDC request processing can be grouped into several logical phases, we generate (usually) only two events, one at the initial receipt of a request, and a second, final, one before sending a reply.  All events relating to the same request can be linked together in the audit log by a 32-character alphanumeric string (about 190 bits of uniqueness) which is randomly generated at the start of processing.  If the request is a S4U2Self or S4U2Proxy request, an additional audit event will be generated with information particular to the S4U request.  The following table lists the logical stages of KDC processing, and which components are logged in the AS and TGS cases:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following information will be made available to audit plugins:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5232</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5232"/>
				<updated>2013-10-11T21:00:46Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: this time, for sure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5231</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5231"/>
				<updated>2013-10-11T20:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: make the 'test' section reflect reality&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, au_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5230</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5230"/>
				<updated>2013-10-11T20:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Add commits and relnotes entries, move to projects/1.12, note experimental nature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
Python test system will become aware of the existence of  &amp;quot;simple&amp;quot; json-based  audit plugin module. Running &amp;quot;make check&amp;quot; will result in storing audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5223</id>
		<title>Projects/White Papers</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5223"/>
				<updated>2013-10-09T17:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: /* Summary of topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To codify in a single place assembled knowledge about the architecture of Kerberos, design considerations/assumptions and how these are present/different in real-world-environments, best practice for operational issues regarding Kerberos, and more.&lt;br /&gt;
&lt;br /&gt;
== Summary of topics ==&lt;br /&gt;
&lt;br /&gt;
List here topics or potential topics for white papers.  Individual papers may have an outline fleshed out as a separate section.&lt;br /&gt;
&lt;br /&gt;
* Revisiting the design assumptions that went into Kerberos' creation and analyzing their current validity&lt;br /&gt;
* Revisiting the Kerberos threat model (from Kerberos' creation) and analyzing present-day weaknesses, possibly with emphasis on preauthentication schemes&lt;br /&gt;
* Operational issues of relevance to running a KDC on the open internet&lt;br /&gt;
* (category, not necessarily a single paper) Discussion of particular enctype(s), known attacks on their ciphers/hashes, and their relevance to Kerberos&lt;br /&gt;
* What could &amp;quot;kerberos in the cloud&amp;quot; mean?  Is there such a concept which is useful?&lt;br /&gt;
* Use cases for PKINIT&lt;br /&gt;
* Use cases for anonymous PKINIT&lt;br /&gt;
* Use cases for anonymous tickets (both realm-anonymous and fully-anonymous)&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5131</id>
		<title>Projects/White Papers</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5131"/>
				<updated>2013-05-30T17:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: /* Summary of topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To codify in a single place assembled knowledge about the architecture of Kerberos, design considerations/assumptions and how these are present/different in real-world-environments, best practice for operational issues regarding Kerberos, and more.&lt;br /&gt;
&lt;br /&gt;
== Summary of topics ==&lt;br /&gt;
&lt;br /&gt;
List here topics or potential topics for white papers.  Individual papers may have an outline fleshed out as a separate section.&lt;br /&gt;
&lt;br /&gt;
* Revisiting the design assumptions that went into Kerberos' creation and analyzing their current validity&lt;br /&gt;
* Revisiting the Kerberos threat model (from Kerberos' creation) and analyzing present-day weaknesses, possibly with emphasis on preauthentication schemes&lt;br /&gt;
* Operational issues of relevance to running a KDC on the open internet&lt;br /&gt;
* (category, not necessarily a single paper) Discussion of particular enctype(s), known attacks on their ciphers/hashes, and their relevance to Kerberos&lt;br /&gt;
* What could &amp;quot;kerberos in the cloud&amp;quot; mean?  Is there such a concept which is useful?&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5130</id>
		<title>Projects/White Papers</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/White_Papers&amp;diff=5130"/>
				<updated>2013-05-30T14:58:04Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Project page for tracking white paper ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To codify in a single place assembled knowledge about the architecture of Kerberos, design considerations/assumptions and how these are present/different in real-world-environments, best practice for operational issues regarding Kerberos, and more.&lt;br /&gt;
&lt;br /&gt;
== Summary of topics ==&lt;br /&gt;
&lt;br /&gt;
List here topics or potential topics for white papers.  Individual papers may have an outline fleshed out as a separate section.&lt;br /&gt;
&lt;br /&gt;
* Revisiting the design assumptions that went into Kerberos' creation and analyzing their current validity&lt;br /&gt;
* Revisiting the Kerberos threat model (from Kerberos' creation) and analyzing present-day weaknesses, possibly with emphasis on preauthentication schemes&lt;br /&gt;
* Operational issues of relevance to running a KDC on the open internet&lt;br /&gt;
* (category, not necessarily a single paper) Discussion of particular enctype(s), known attacks on their ciphers/hashes, and their relevance to Kerberos&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4952</id>
		<title>Manual Testing</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4952"/>
				<updated>2012-11-21T23:47:37Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: /* Valgrind */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes manual testing procedures.  There are two reasons these exist:&lt;br /&gt;
&lt;br /&gt;
# Manual testing is sometimes simpler than running an automated test and instrumenting it.&lt;br /&gt;
# In some cases we have a manual testing procedure for part of the code, but not an automated test.&lt;br /&gt;
&lt;br /&gt;
We do have an automated [[Test suite]].&lt;br /&gt;
&lt;br /&gt;
==Basic Test KDC Setup==&lt;br /&gt;
&lt;br /&gt;
Test KDCs are a crucial building block of testing.  You can set one up easily by running &amp;quot;make testrealm&amp;quot; in the top level of a build tree, or you can follow these steps to set one up by hand:&lt;br /&gt;
&lt;br /&gt;
1. Pick a name for your test KDC; this example will assume EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
2. Do a build and install of the krb5 sources into some prefix; this example will assume /usr/local, but anywhere is fine.  Put the prefix's bin and sbin directories in your path, or use full pathnames for the commands below.&lt;br /&gt;
&lt;br /&gt;
3. Pick two port numbers, for the KDC and admin server.  This example will assume 50000 and 50001.&lt;br /&gt;
&lt;br /&gt;
4. Set up a krb5.conf file somewhere; this example will assume /usr/local/etc/krb5.conf.  Make it look something like:&lt;br /&gt;
  [libdefaults]&lt;br /&gt;
    default_realm = EXAMPLE.COM&lt;br /&gt;
    # Depending on what you are testing, you may want something like:&lt;br /&gt;
    # default_keytab_name = FILE:/usr/local/var/keytab&lt;br /&gt;
  [realms]&lt;br /&gt;
    EXAMPLE.COM = {&lt;br /&gt;
      admin_server = 127.0.0.1:50001&lt;br /&gt;
      kdc = 127.0.0.1:50000&lt;br /&gt;
      database_module = DB2&lt;br /&gt;
      kdc_ports = 50000&lt;br /&gt;
      kadmind_port = 50001&lt;br /&gt;
    }&lt;br /&gt;
  [dbmodules]&lt;br /&gt;
    DB2 = {&lt;br /&gt;
      db_library = db2&lt;br /&gt;
    }&lt;br /&gt;
  [logging]&lt;br /&gt;
    # Use any pathnames you want here.&lt;br /&gt;
    kdc = FILE:/usr/local/var/krb5kdc/kdc.log&lt;br /&gt;
    admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log&lt;br /&gt;
  # Depending on what you are testing, you may want:&lt;br /&gt;
  # [domain_realm]&lt;br /&gt;
  #   .your.domain = EXAMPLE.COM&lt;br /&gt;
Set the environment variable KRB5_CONFIG to the pathname of this krb5.conf file.  Set the environment variable KRB5_KDC_PROFILE to /dev/null.&lt;br /&gt;
&lt;br /&gt;
5. Run:&lt;br /&gt;
  kdb5_util create -s&lt;br /&gt;
Enter a master password; it can be something insecure like &amp;quot;master&amp;quot;.  The DB will be created in /usr/local/var/krb5kdc/principal and a few other similarly-named files.  The master key stash will be created in /usr/local/var/krb5kdc/.k5.EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
6. Run:&lt;br /&gt;
  kadmin.local&lt;br /&gt;
  addprinc user&lt;br /&gt;
  quit&lt;br /&gt;
Enter a user password; it can be something insecure like &amp;quot;user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
7. Start the KDC by running:&lt;br /&gt;
  krb5kdc&lt;br /&gt;
Check the log file specified in krb5.conf if the KDC has any trouble starting.  You should be able to &amp;quot;kinit user&amp;quot; at this point.&lt;br /&gt;
&lt;br /&gt;
8. If you need kadmind, add another principle user/admin (using kadmin.local as described above), and create the file /usr/local/var/krb5kdc/kadm5.acl containing:&lt;br /&gt;
  user/admin *&lt;br /&gt;
Then start the kadmind server with:&lt;br /&gt;
  kadmind&lt;br /&gt;
If it has trouble starting, check the log file specified in krb5.conf.&lt;br /&gt;
&lt;br /&gt;
==Services4User testing==&lt;br /&gt;
&lt;br /&gt;
A test for Services4User can be found in tests/gssapi/t_s4u.c. You will need a W2K3 or higher AD domain to test this. Notes follow:&lt;br /&gt;
&lt;br /&gt;
* Create a computer account FOO$ using Active Directory Users &amp;amp; Computers (ADUC)&lt;br /&gt;
* Set the UPN to host/foo.domain (no suffix); this is necessary to be able to send an AS-REQ as this principal, otherwise you would need to use the canonical name (FOO$), which will cause principal comparison errors in gss_accept_sec_context() (note: apparently only W2K8 supports suffix-less UPNs; you should use the domain as a suffix for earlier versions). There is an attribute editor in the W2K8 ADUC that lets you do this, otherwise you will need to use LDP.exe or a generic LDAP client.&lt;br /&gt;
* Add a SPN of host/foo.domain. (Again, you can use ADUC in W2K8, or LDP.exe/generic client.)&lt;br /&gt;
* Configure the computer account to support constrained delegation with protocol transition (Trust this computer for delegation to specified services only / Use any authentication protocol)&lt;br /&gt;
* Add host/foo.domain to the keytab (possibly easiest to do this manually with ktadd)&lt;br /&gt;
&lt;br /&gt;
For S4U2Proxy to work the TGT must be forwardable too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit -k -t test.keytab -f 'host/test.win.mit.edu@WIN.MIT.EDU'&lt;br /&gt;
./t_s4u delegtest@WIN.MIT.EDU HOST/winhost.win.mit.edu@WIN.MIT.EDU test.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example delegtest@WIN.MIT.EDU is the principal on whose behalf credentials are acquired using S4U2Self; HOST/winhost.win.mit.edu is the host to which we wish to delegate using S4U2Proxy; and test.keytab contains the long term key for test.win.mit.edu.&lt;br /&gt;
&lt;br /&gt;
To test S4U2Self with the MIT KDC, set the ok_to_auth_as_delegate attribute on the service principal using kadmin.&lt;br /&gt;
&lt;br /&gt;
==GSS-API Naming Extensions testing==&lt;br /&gt;
&lt;br /&gt;
Note: the S4U test also tests the GSS-API naming extensions, but there also is a specific test in tests/gssapi/t_namingexts.c. This tests the following APIs:&lt;br /&gt;
&lt;br /&gt;
* gss_import_name() with composite names&lt;br /&gt;
* gss_inquire_name()&lt;br /&gt;
* gss_get_name_attribute()&lt;br /&gt;
* gss_set_name_attribute()&lt;br /&gt;
* gss_delete_name_attribute()&lt;br /&gt;
* gss_export_name_composite()&lt;br /&gt;
* gss_map_name_to_any&lt;br /&gt;
* gss_release_any_name_mapping&lt;br /&gt;
&lt;br /&gt;
Note: gss_display_name_ext() is not tested because we don't yet have a concrete implementation of it.&lt;br /&gt;
&lt;br /&gt;
The usage of this test is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t_namingexts [--spnego] [principal] [keytab]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the optional --spnego argument uses the SPNEGO (as opposed to the krb5) mechanism; principal is the service principal to test with, and keytab is a path to the keytab containing the key for the service principal. (The client and service principal are identical in the test. To test with another client principal, use the S4U test.)&lt;br /&gt;
&lt;br /&gt;
You likely want to test this against a Windows KDC, in order to validate PAC introspection; however, you can also test with the greet_client (and greet_server) plugins that are included in plugins/authdata/greet_{client,server}.&lt;br /&gt;
&lt;br /&gt;
==Principal lockout testing==&lt;br /&gt;
&lt;br /&gt;
There are now some automated lockout tests, but these procedures are still helpful for examining some edge cases.&lt;br /&gt;
&lt;br /&gt;
Testing for lockout is identical for the LDAP and DB2 backends, although if you wish to test the replication functionality, you'll need to use a DB2 backend. No changes are required for configuring kprop/iprop; it's business as usual (the only difference being that lockout-related attributes will not be replicated, so as part of testing you should verify on each KDC that this is the case).&lt;br /&gt;
&lt;br /&gt;
First, you need to create a password policy that specifies a lockout policy. Do this with kadmin. Here we create a policy where a maximum failure count of 3, a failure count reset interval of 180 seconds, and a lockout duration of 60 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: addpol -maxfailure 3 -failurecountinterval 180 -lockoutduration 60 lockout_test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you need to associate a principal with the lockout policy. Note also that the pre-authentication required attribute must be set on the principal; principals without this attribute set are not subject to the lockout policy (as they are not required to prove knowledge of their long-term key to the KDC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin:  modprinc -policy lockout_test +requires_preauth lukeh&lt;br /&gt;
Principal &amp;quot;lukeh@MIT.DE.PADL.COM&amp;quot; modified.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, perform a successful authentication with kinit. You should see the last successful authentication timestamp updated in the information returned by kadmin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last successful authentication: Wed Oct 07 14:07:08 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perform an unsuccessful authentication (ie. kinit with an incorrect password) and you should see the failed authentication timestamp and count updated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:07:58 CEST 2009&lt;br /&gt;
Failed password attempts: 1&lt;br /&gt;
Account locked time: [never]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another two authentication failures (recall, the maximum failure count above is 3) and you should see that the principal is locked out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
Failed password attempts: 3&lt;br /&gt;
Account locked time: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can try to unlock the account explicitly with &amp;lt;i&amp;gt;modprinc -unlock&amp;lt;/i&amp;gt;, or you can wait the lockout duration (here, 60 seconds) and you should be able to authenticate again.&lt;br /&gt;
&lt;br /&gt;
==KDC worker processes==&lt;br /&gt;
&lt;br /&gt;
There is a very basic automated test of parallel KDC worker processes, but it doesn't ensure that all worker processes can receive packets.  To test that, make the following temporary code modifications:&lt;br /&gt;
&lt;br /&gt;
* In plugins/kdb/db2/kdb_db2.c:krb5_db2_get_principal(), add this code near the beginning:&lt;br /&gt;
&lt;br /&gt;
    if (searchfor-&amp;gt;length &amp;gt;= 1 &amp;amp;&amp;amp;&lt;br /&gt;
        data_eq_string(searchfor-&amp;gt;data[0], &amp;quot;slowuser&amp;quot;))&lt;br /&gt;
        sleep(60);&lt;br /&gt;
&lt;br /&gt;
* In lib/krb5/os/sendto_kdc.c, change MAX_PASS from 3 to 1, and in krb5_sendto_kdc() change all assignments of socktype2 to 0.  This ensures that kinit will only send one request.&lt;br /&gt;
&lt;br /&gt;
* In util/k5test.py, change the default arguments for the start_kdc() realm method like so:&lt;br /&gt;
&lt;br /&gt;
    def start_kdc(self, args=['-w', '3']):&lt;br /&gt;
&lt;br /&gt;
Build the sources and run &amp;quot;make testrealm&amp;quot;.  You should be able to run &amp;quot;kinit slowuser&amp;quot; three times before the KDC becomes unresponsive to &amp;quot;kinit user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==SAM-2 preauth client code==&lt;br /&gt;
&lt;br /&gt;
The securid_sam2 preauth module isn't built by default and ordinarily only compiles successfully in the presence of the RSA ACE library.  But it can be built with alternate flags to use a test method which can help exercise the client SAM-2 preauth code in send-encrypted-sad mode.&lt;br /&gt;
&lt;br /&gt;
* First, build the securid_sam2 module with the test method instead of the securid method:&lt;br /&gt;
&lt;br /&gt;
    cd plugins/preauth/securid_sam2&lt;br /&gt;
    make DEFINES='-DGRAIL_PREAUTH' ACELIB=&lt;br /&gt;
    cd ../../..&lt;br /&gt;
&lt;br /&gt;
* Start with a basic test realm:&lt;br /&gt;
&lt;br /&gt;
    make testrealm&lt;br /&gt;
&lt;br /&gt;
* Edit testdir/krb5.master.conf and add the following to register the module.  Make sure to specify the correct absolute path to the module shared object, which will depend on where your build directory is located.&lt;br /&gt;
&lt;br /&gt;
    [plugins]&lt;br /&gt;
        kdcpreauth = {&lt;br /&gt;
            module = securid_sam2:/path/to/plugins/preauth/securid_sam2/securid_sam2.so&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
* Do the following in kadmin.local:&lt;br /&gt;
&lt;br /&gt;
    addprinc -randkey user/GRAIL&lt;br /&gt;
    modprinc +requires_hwauth user&lt;br /&gt;
&lt;br /&gt;
* Restart the KDC (find the pid of the running krb5kdc process, kill it, and then run &amp;quot;krb5kdc&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* Run &amp;quot;kinit user&amp;quot;.  If you enter the correct password for user and correctly echo the challenge, you should get tickets.  If you enter either one wrong, you should get an error.&lt;br /&gt;
&lt;br /&gt;
* Remember to kill your krb5kdc process after exiting the test realm; the test realm code won't clean up the one you started by hand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Valgrind==&lt;br /&gt;
&lt;br /&gt;
Many of the automated tests are configured to optionally be run under valgrind, a memory checking tool.  However, some tests will fail if there is extra output on stdout or stderr, such as that written by valgrind's summary report.  Manually running the test suite under valgrind can be done with&lt;br /&gt;
&lt;br /&gt;
    make VALGRIND='${VALGRIND1}' check&lt;br /&gt;
&lt;br /&gt;
The VALGRIND1 variable is set automatically by the build system to run with the memory checker, a log file at BUILDTOP/vg.[pid] and a list of known warnings to suppress.  It is a make variable, not a shell/environment variable, so it must be quoted on the command line.&lt;br /&gt;
&lt;br /&gt;
In order to get more useful stack traces from valgrind, it may be useful to add RTLD_NODELETE to the flags passed to dlopen() in src/util/support/plugins.c (if your platform supports that flag).  Compiling with debugging symbols is also useful.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4951</id>
		<title>Manual Testing</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4951"/>
				<updated>2012-11-21T21:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: recommended way to run tests with valgrind&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes manual testing procedures.  There are two reasons these exist:&lt;br /&gt;
&lt;br /&gt;
# Manual testing is sometimes simpler than running an automated test and instrumenting it.&lt;br /&gt;
# In some cases we have a manual testing procedure for part of the code, but not an automated test.&lt;br /&gt;
&lt;br /&gt;
We do have an automated [[Test suite]].&lt;br /&gt;
&lt;br /&gt;
==Basic Test KDC Setup==&lt;br /&gt;
&lt;br /&gt;
Test KDCs are a crucial building block of testing.  You can set one up easily by running &amp;quot;make testrealm&amp;quot; in the top level of a build tree, or you can follow these steps to set one up by hand:&lt;br /&gt;
&lt;br /&gt;
1. Pick a name for your test KDC; this example will assume EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
2. Do a build and install of the krb5 sources into some prefix; this example will assume /usr/local, but anywhere is fine.  Put the prefix's bin and sbin directories in your path, or use full pathnames for the commands below.&lt;br /&gt;
&lt;br /&gt;
3. Pick two port numbers, for the KDC and admin server.  This example will assume 50000 and 50001.&lt;br /&gt;
&lt;br /&gt;
4. Set up a krb5.conf file somewhere; this example will assume /usr/local/etc/krb5.conf.  Make it look something like:&lt;br /&gt;
  [libdefaults]&lt;br /&gt;
    default_realm = EXAMPLE.COM&lt;br /&gt;
    # Depending on what you are testing, you may want something like:&lt;br /&gt;
    # default_keytab_name = FILE:/usr/local/var/keytab&lt;br /&gt;
  [realms]&lt;br /&gt;
    EXAMPLE.COM = {&lt;br /&gt;
      admin_server = 127.0.0.1:50001&lt;br /&gt;
      kdc = 127.0.0.1:50000&lt;br /&gt;
      database_module = DB2&lt;br /&gt;
      kdc_ports = 50000&lt;br /&gt;
      kadmind_port = 50001&lt;br /&gt;
    }&lt;br /&gt;
  [dbmodules]&lt;br /&gt;
    DB2 = {&lt;br /&gt;
      db_library = db2&lt;br /&gt;
    }&lt;br /&gt;
  [logging]&lt;br /&gt;
    # Use any pathnames you want here.&lt;br /&gt;
    kdc = FILE:/usr/local/var/krb5kdc/kdc.log&lt;br /&gt;
    admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log&lt;br /&gt;
  # Depending on what you are testing, you may want:&lt;br /&gt;
  # [domain_realm]&lt;br /&gt;
  #   .your.domain = EXAMPLE.COM&lt;br /&gt;
Set the environment variable KRB5_CONFIG to the pathname of this krb5.conf file.  Set the environment variable KRB5_KDC_PROFILE to /dev/null.&lt;br /&gt;
&lt;br /&gt;
5. Run:&lt;br /&gt;
  kdb5_util create -s&lt;br /&gt;
Enter a master password; it can be something insecure like &amp;quot;master&amp;quot;.  The DB will be created in /usr/local/var/krb5kdc/principal and a few other similarly-named files.  The master key stash will be created in /usr/local/var/krb5kdc/.k5.EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
6. Run:&lt;br /&gt;
  kadmin.local&lt;br /&gt;
  addprinc user&lt;br /&gt;
  quit&lt;br /&gt;
Enter a user password; it can be something insecure like &amp;quot;user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
7. Start the KDC by running:&lt;br /&gt;
  krb5kdc&lt;br /&gt;
Check the log file specified in krb5.conf if the KDC has any trouble starting.  You should be able to &amp;quot;kinit user&amp;quot; at this point.&lt;br /&gt;
&lt;br /&gt;
8. If you need kadmind, add another principle user/admin (using kadmin.local as described above), and create the file /usr/local/var/krb5kdc/kadm5.acl containing:&lt;br /&gt;
  user/admin *&lt;br /&gt;
Then start the kadmind server with:&lt;br /&gt;
  kadmind&lt;br /&gt;
If it has trouble starting, check the log file specified in krb5.conf.&lt;br /&gt;
&lt;br /&gt;
==Services4User testing==&lt;br /&gt;
&lt;br /&gt;
A test for Services4User can be found in tests/gssapi/t_s4u.c. You will need a W2K3 or higher AD domain to test this. Notes follow:&lt;br /&gt;
&lt;br /&gt;
* Create a computer account FOO$ using Active Directory Users &amp;amp; Computers (ADUC)&lt;br /&gt;
* Set the UPN to host/foo.domain (no suffix); this is necessary to be able to send an AS-REQ as this principal, otherwise you would need to use the canonical name (FOO$), which will cause principal comparison errors in gss_accept_sec_context() (note: apparently only W2K8 supports suffix-less UPNs; you should use the domain as a suffix for earlier versions). There is an attribute editor in the W2K8 ADUC that lets you do this, otherwise you will need to use LDP.exe or a generic LDAP client.&lt;br /&gt;
* Add a SPN of host/foo.domain. (Again, you can use ADUC in W2K8, or LDP.exe/generic client.)&lt;br /&gt;
* Configure the computer account to support constrained delegation with protocol transition (Trust this computer for delegation to specified services only / Use any authentication protocol)&lt;br /&gt;
* Add host/foo.domain to the keytab (possibly easiest to do this manually with ktadd)&lt;br /&gt;
&lt;br /&gt;
For S4U2Proxy to work the TGT must be forwardable too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit -k -t test.keytab -f 'host/test.win.mit.edu@WIN.MIT.EDU'&lt;br /&gt;
./t_s4u delegtest@WIN.MIT.EDU HOST/winhost.win.mit.edu@WIN.MIT.EDU test.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example delegtest@WIN.MIT.EDU is the principal on whose behalf credentials are acquired using S4U2Self; HOST/winhost.win.mit.edu is the host to which we wish to delegate using S4U2Proxy; and test.keytab contains the long term key for test.win.mit.edu.&lt;br /&gt;
&lt;br /&gt;
To test S4U2Self with the MIT KDC, set the ok_to_auth_as_delegate attribute on the service principal using kadmin.&lt;br /&gt;
&lt;br /&gt;
==GSS-API Naming Extensions testing==&lt;br /&gt;
&lt;br /&gt;
Note: the S4U test also tests the GSS-API naming extensions, but there also is a specific test in tests/gssapi/t_namingexts.c. This tests the following APIs:&lt;br /&gt;
&lt;br /&gt;
* gss_import_name() with composite names&lt;br /&gt;
* gss_inquire_name()&lt;br /&gt;
* gss_get_name_attribute()&lt;br /&gt;
* gss_set_name_attribute()&lt;br /&gt;
* gss_delete_name_attribute()&lt;br /&gt;
* gss_export_name_composite()&lt;br /&gt;
* gss_map_name_to_any&lt;br /&gt;
* gss_release_any_name_mapping&lt;br /&gt;
&lt;br /&gt;
Note: gss_display_name_ext() is not tested because we don't yet have a concrete implementation of it.&lt;br /&gt;
&lt;br /&gt;
The usage of this test is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t_namingexts [--spnego] [principal] [keytab]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the optional --spnego argument uses the SPNEGO (as opposed to the krb5) mechanism; principal is the service principal to test with, and keytab is a path to the keytab containing the key for the service principal. (The client and service principal are identical in the test. To test with another client principal, use the S4U test.)&lt;br /&gt;
&lt;br /&gt;
You likely want to test this against a Windows KDC, in order to validate PAC introspection; however, you can also test with the greet_client (and greet_server) plugins that are included in plugins/authdata/greet_{client,server}.&lt;br /&gt;
&lt;br /&gt;
==Principal lockout testing==&lt;br /&gt;
&lt;br /&gt;
There are now some automated lockout tests, but these procedures are still helpful for examining some edge cases.&lt;br /&gt;
&lt;br /&gt;
Testing for lockout is identical for the LDAP and DB2 backends, although if you wish to test the replication functionality, you'll need to use a DB2 backend. No changes are required for configuring kprop/iprop; it's business as usual (the only difference being that lockout-related attributes will not be replicated, so as part of testing you should verify on each KDC that this is the case).&lt;br /&gt;
&lt;br /&gt;
First, you need to create a password policy that specifies a lockout policy. Do this with kadmin. Here we create a policy where a maximum failure count of 3, a failure count reset interval of 180 seconds, and a lockout duration of 60 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: addpol -maxfailure 3 -failurecountinterval 180 -lockoutduration 60 lockout_test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you need to associate a principal with the lockout policy. Note also that the pre-authentication required attribute must be set on the principal; principals without this attribute set are not subject to the lockout policy (as they are not required to prove knowledge of their long-term key to the KDC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin:  modprinc -policy lockout_test +requires_preauth lukeh&lt;br /&gt;
Principal &amp;quot;lukeh@MIT.DE.PADL.COM&amp;quot; modified.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, perform a successful authentication with kinit. You should see the last successful authentication timestamp updated in the information returned by kadmin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last successful authentication: Wed Oct 07 14:07:08 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perform an unsuccessful authentication (ie. kinit with an incorrect password) and you should see the failed authentication timestamp and count updated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:07:58 CEST 2009&lt;br /&gt;
Failed password attempts: 1&lt;br /&gt;
Account locked time: [never]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another two authentication failures (recall, the maximum failure count above is 3) and you should see that the principal is locked out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
Failed password attempts: 3&lt;br /&gt;
Account locked time: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can try to unlock the account explicitly with &amp;lt;i&amp;gt;modprinc -unlock&amp;lt;/i&amp;gt;, or you can wait the lockout duration (here, 60 seconds) and you should be able to authenticate again.&lt;br /&gt;
&lt;br /&gt;
==KDC worker processes==&lt;br /&gt;
&lt;br /&gt;
There is a very basic automated test of parallel KDC worker processes, but it doesn't ensure that all worker processes can receive packets.  To test that, make the following temporary code modifications:&lt;br /&gt;
&lt;br /&gt;
* In plugins/kdb/db2/kdb_db2.c:krb5_db2_get_principal(), add this code near the beginning:&lt;br /&gt;
&lt;br /&gt;
    if (searchfor-&amp;gt;length &amp;gt;= 1 &amp;amp;&amp;amp;&lt;br /&gt;
        data_eq_string(searchfor-&amp;gt;data[0], &amp;quot;slowuser&amp;quot;))&lt;br /&gt;
        sleep(60);&lt;br /&gt;
&lt;br /&gt;
* In lib/krb5/os/sendto_kdc.c, change MAX_PASS from 3 to 1, and in krb5_sendto_kdc() change all assignments of socktype2 to 0.  This ensures that kinit will only send one request.&lt;br /&gt;
&lt;br /&gt;
* In util/k5test.py, change the default arguments for the start_kdc() realm method like so:&lt;br /&gt;
&lt;br /&gt;
    def start_kdc(self, args=['-w', '3']):&lt;br /&gt;
&lt;br /&gt;
Build the sources and run &amp;quot;make testrealm&amp;quot;.  You should be able to run &amp;quot;kinit slowuser&amp;quot; three times before the KDC becomes unresponsive to &amp;quot;kinit user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==SAM-2 preauth client code==&lt;br /&gt;
&lt;br /&gt;
The securid_sam2 preauth module isn't built by default and ordinarily only compiles successfully in the presence of the RSA ACE library.  But it can be built with alternate flags to use a test method which can help exercise the client SAM-2 preauth code in send-encrypted-sad mode.&lt;br /&gt;
&lt;br /&gt;
* First, build the securid_sam2 module with the test method instead of the securid method:&lt;br /&gt;
&lt;br /&gt;
    cd plugins/preauth/securid_sam2&lt;br /&gt;
    make DEFINES='-DGRAIL_PREAUTH' ACELIB=&lt;br /&gt;
    cd ../../..&lt;br /&gt;
&lt;br /&gt;
* Start with a basic test realm:&lt;br /&gt;
&lt;br /&gt;
    make testrealm&lt;br /&gt;
&lt;br /&gt;
* Edit testdir/krb5.master.conf and add the following to register the module.  Make sure to specify the correct absolute path to the module shared object, which will depend on where your build directory is located.&lt;br /&gt;
&lt;br /&gt;
    [plugins]&lt;br /&gt;
        kdcpreauth = {&lt;br /&gt;
            module = securid_sam2:/path/to/plugins/preauth/securid_sam2/securid_sam2.so&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
* Do the following in kadmin.local:&lt;br /&gt;
&lt;br /&gt;
    addprinc -randkey user/GRAIL&lt;br /&gt;
    modprinc +requires_hwauth user&lt;br /&gt;
&lt;br /&gt;
* Restart the KDC (find the pid of the running krb5kdc process, kill it, and then run &amp;quot;krb5kdc&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* Run &amp;quot;kinit user&amp;quot;.  If you enter the correct password for user and correctly echo the challenge, you should get tickets.  If you enter either one wrong, you should get an error.&lt;br /&gt;
&lt;br /&gt;
* Remember to kill your krb5kdc process after exiting the test realm; the test realm code won't clean up the one you started by hand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Valgrind==&lt;br /&gt;
&lt;br /&gt;
Many of the automated tests are configured to optionally be run under valgrind, a memory checking tool.  However, some tests will fail if there is extra output on stdout or stderr, such as that written by valgrind's summary report.  Manually running the test suite under valgrind can be done with&lt;br /&gt;
&lt;br /&gt;
    make VALGRIND='${VALGRIND1}' check&lt;br /&gt;
&lt;br /&gt;
The VALGRIND1 variable is set automatically by the build system to run with the memory checker, a log file at BUILDTOP/vg.[pid] and a list of known warnings to suppress.  It is a make variable, not a shell/environment variable, so it must be quoted on the command line.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=4946</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=4946"/>
				<updated>2012-11-13T19:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrix of Document-Type VS Intended Readership&lt;br /&gt;
|-&lt;br /&gt;
! Doc-type/Reader&lt;br /&gt;
! Architectural Guide&lt;br /&gt;
! Setup &amp;amp; Config of Kerberos&lt;br /&gt;
! Admin &amp;amp; Operations of Kerberos&lt;br /&gt;
! Custom Build&lt;br /&gt;
! API Description&lt;br /&gt;
! API Details&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| End-users || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Architects || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|System Admins || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Application Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|GSSAPI Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Kerberos Developers || || || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || DONE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || ready for review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || || DONE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin || DONE&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential&amp;lt;/ul&amp;gt;|| TY || 2012-04-27 ||need examples ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || DONE&lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || DONE&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-08-15|| ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Intro for admins&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Technical overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||under review&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Replication&amp;lt;/ul&amp;gt;|| ZT|| || || DONE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-10-01|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-10-01|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || DONE&lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Trace logging&amp;lt;/ul&amp;gt;||GH ||2012-03-22|| ||DONE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid) DONE&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||DONE&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || || DONE&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
===Most commonly used API functions (in alphabetical order)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! API&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API functions.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=4931</id>
		<title>Projects/Kerberos Documentation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=4931"/>
				<updated>2012-11-02T16:36:54Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: import content from philsophy.rst in the doc tree&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The goal of the project is to create an infrastructure  and process for the future development of the extensive Kerberos documentation.&lt;br /&gt;
The documentation should be useful and correct; it must be detailed, but optimized -- do not be too verbose.&lt;br /&gt;
&lt;br /&gt;
'''The documentation will be built incrementally. We will analyze what works and what doesn't and correct the course of action as needed.'''&lt;br /&gt;
Part of the criteria for &amp;quot;what works&amp;quot; is that the documentation should be easy to maintain.&lt;br /&gt;
&lt;br /&gt;
The actualized  documentation will be useful for developers and administrators, both for experienced ones and newcomers. It will address the following topics:&lt;br /&gt;
&lt;br /&gt;
* Complete reference - API, internal functions, data types, macros &lt;br /&gt;
* Tutorial for application developers - description on various tasks such as working with credentials, topics on how to write plugins, etc&lt;br /&gt;
* Cookbook for administrators  - Installation, configuration, troubleshooting.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
Please, follow this link for Kerberos documentation general example  [http://web.mit.edu/tsitkova/www/build/index.html];&lt;br /&gt;
advanced admin  topic example: [http://web.mit.edu/tsitkova/www/build/cookbook/advanced/ldapbackend.html]&lt;br /&gt;
MIT Kerberos features: [http://web.mit.edu/tsitkova/www/build/mitK5features.html]&lt;br /&gt;
&lt;br /&gt;
== Documentation for application developers ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Generally any topic in the Kerberos documentation can cross-reference with function documentation and each other. See [http://web.mit.edu/tsitkova/www/build/tutorial/h5l_mit_apidiff.html]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Details of source documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Documenting functions ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Part_1=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following fields ''must'' be included in the function documentation and should reside in the source code  :&lt;br /&gt;
&lt;br /&gt;
# Function signature&lt;br /&gt;
# Brief function description&lt;br /&gt;
# Arguments - [in/out] with description&lt;br /&gt;
# Return value description&lt;br /&gt;
# Detailed description (optional)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One can see that Part_1 contains the information that is the most useful for those who update the code and fix the bugs. To avoid the code overcrowding and make any additions to the function documentation as simple as possible, we suggest to save additional documentation ( see below Part_2) in the separate location - one file per function.. &lt;br /&gt;
&lt;br /&gt;
Effectively this means that we expect the Doxygen style comments in the headers in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @brief Some brief description&lt;br /&gt;
 * &lt;br /&gt;
 * Optional  detailed description &lt;br /&gt;
 * &lt;br /&gt;
 * @param[in]  arg1  Description of arg1&lt;br /&gt;
 *&lt;br /&gt;
 * @return Something useful&lt;br /&gt;
 */&lt;br /&gt;
char * KRB5_CALLCONV &lt;br /&gt;
krb5_X(type arg1) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, that ''@brief'' notation may be omitted if JAVADOC_AUTOBRIEF is set to YES in the Doxygen configuration file. In this case the very first line of the  comments will be interpreted as the brief description:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/** Some brief description&lt;br /&gt;
 * &lt;br /&gt;
 * Optional  detailed description &lt;br /&gt;
 * &lt;br /&gt;
 * @param[in]  arg1  Description of arg1&lt;br /&gt;
 *&lt;br /&gt;
 * @return Something useful&lt;br /&gt;
 */&lt;br /&gt;
char * KRB5_CALLCONV &lt;br /&gt;
krb5_X(type arg1) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Part_2=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ''optional'' fields may include:&lt;br /&gt;
&lt;br /&gt;
# ''See also'' section to refer to the related functions, &lt;br /&gt;
# ''Note'' section to highlight the specifics of the behaivor&lt;br /&gt;
# Examples of the usage&lt;br /&gt;
# Snap-shot of the real code involving this function&lt;br /&gt;
# Links to KRB5 Wiki Project page, krbdev discussion, RFC document or its section etc&lt;br /&gt;
# Version of Kerberos when fuction was introduced or became obsolete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Part_2 in ReST format '''&lt;br /&gt;
&lt;br /&gt;
When available, we suggest to have Part_2  information associated with the particular function in ReST format. For example:&lt;br /&gt;
&lt;br /&gt;
 * Warnings and suggestions&lt;br /&gt;
   Warn about any potential mistakes and misuse.&lt;br /&gt;
   Point to other useful routines.&lt;br /&gt;
&lt;br /&gt;
  * Links to RFC, wiki Projects, krbdev discussions&lt;br /&gt;
   :rfc:4120 &lt;br /&gt;
   Or if you want to reffer to the specific section of the RFC use the following notation: :rfc:4120#section-5.2&lt;br /&gt;
   Or link to Kerberos Project page, for example, Disable_DES project  &amp;lt;http://k5wiki.kerberos.org/wiki/Projects/Disable_DES&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  * Example&lt;br /&gt;
     The place for the function usage examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Part_2 in Doxygen format '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alternatively, when desired,  Part_2 may be documented in Doxygen format by adding ''@include'' directive to the comment, for example, to reference to example code fragments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/** Some brief description&lt;br /&gt;
 * &lt;br /&gt;
 * Optional  detailed description &lt;br /&gt;
 * &lt;br /&gt;
 * @param[in]  arg1  Description of arg1&lt;br /&gt;
 *&lt;br /&gt;
 * @return Something useful&lt;br /&gt;
 *&lt;br /&gt;
 * @include example_krb5_X.c&lt;br /&gt;
 */&lt;br /&gt;
char * KRB5_CALLCONV &lt;br /&gt;
krb5_X(type arg1) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: The path to the example file (here  example_krb5_X.c) must be set in the EXAMPLE_PATH tag in the Doxygen configuration file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Workflow: Putting Part_1 and Part_2 together=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Configure Doxygen to generate output both in xml and html formats. Run Doxygen.&lt;br /&gt;
# For each function and data type generate document in ReST format. It is expected that it contains information from Part_1. For the function ''krb5_X()'' lets call it ''krb5_X_p1''.&lt;br /&gt;
# (For ReST format only) If the Part_2 documentation for  ''krb5_X()'' has been already written, there is a file called ''krb5_X_p2.rst'' in the designated directory. If not - nothing happens.&lt;br /&gt;
# (For ReST format only) Concatenate ''krb5_X_p1'' and  ''krb5_X_p2.rst'' (if it exists), add the link to Doxygen generated documentation for this function in html format (generated automatically)  and save as a file  ''krb5_X.rst''. &lt;br /&gt;
# File  ''krb5_X.rst''  can be used as input for Sphinx &lt;br /&gt;
&lt;br /&gt;
NOTE: Initially we provide Python script to automate steps 2-4. The whole process will be automated later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Documenting data types ====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
# The core team - the administrator - posts the initial list of the tasks (such as API, admin tasks, &amp;quot;How to&amp;quot;-s etc) and further supports it. See [[Projects/Documentation Tasks]] for more detailed information.&lt;br /&gt;
# Community can suggest new tasks &lt;br /&gt;
# The core team provides templates that, if helpful, may be used by the documentation writers. The most desirable format for the contributed documents is ReST as the easiest to integrate with the mainstream documentation.&lt;br /&gt;
# Community can provide the feedback on the documented tasks.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Doxygen 1.7.2 &amp;lt;http://www.stack.nl/~dimitri/doxygen/index.html&amp;gt;&lt;br /&gt;
* Sphinx 1.0.4  &amp;lt;http://sphinx.pocoo.org&amp;gt;&lt;br /&gt;
* Python 2.5+ (with lxml extension)&lt;br /&gt;
* Cheetah 2.4.4 &amp;lt;http://www.cheetahtemplate.org&amp;gt;&lt;br /&gt;
* Restructured Text markup &amp;lt;http://docutils.sourceforge.net/docs/user/rst/quickstart.html&amp;gt;&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4857</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4857"/>
				<updated>2012-10-02T20:45:16Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;br /&gt;
&lt;br /&gt;
Per http://wiki.netbsd.org/pkgsrc/how_to_use_pkgsrc_on_solaris/ , perhaps the only thing we do not have but need is SUNWsprot.&lt;br /&gt;
&lt;br /&gt;
Mounting iso images in solaris: https://blogs.oracle.com/gerhardhofweber/entry/mounting_iso_images_in_solaris&lt;br /&gt;
Uses lofiadm to make a mountable device for 'mount -F hsfs'&lt;br /&gt;
&lt;br /&gt;
   # mkdir -p /iso/sol-10-u10-ga2-sparc&lt;br /&gt;
   # lofiadm -a /var/tmp/sol-10-u10-ga2-sparc-dvd.iso&lt;br /&gt;
   /dev/lofi/1&lt;br /&gt;
   # mount -F hsfs -o ro /dev/lofi/1 /iso/sol-10-u10-ga2-sparc&lt;br /&gt;
&lt;br /&gt;
Attempting&lt;br /&gt;
   pkgadd -d /iso/sol-10-u10-ga2-sparc/Solaris_10/Product/ SUNWsprot&lt;br /&gt;
claims it is already installed, though.  pkginfo confirms; I must have missed it the first time around.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4856</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4856"/>
				<updated>2012-10-02T20:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;br /&gt;
&lt;br /&gt;
Per http://wiki.netbsd.org/pkgsrc/how_to_use_pkgsrc_on_solaris/ , perhaps the only thing we do not have but need is SUNWsprot.&lt;br /&gt;
&lt;br /&gt;
Mounting iso images in solaris: https://blogs.oracle.com/gerhardhofweber/entry/mounting_iso_images_in_solaris&lt;br /&gt;
Uses lofiadm to make a mountable device for 'mount -F hsfs'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # mkdir -p /iso/sol-10-u10-ga2-sparc&lt;br /&gt;
   # lofiadm -a /var/tmp/sol-10-u10-ga2-sparc-dvd.iso&lt;br /&gt;
   /dev/lofi/1&lt;br /&gt;
   # mount -F hsfs -o ro /dev/lofi/1 /iso/sol-10-u10-ga2-sparc&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4855</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4855"/>
				<updated>2012-10-02T20:38:12Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;br /&gt;
&lt;br /&gt;
Per http://wiki.netbsd.org/pkgsrc/how_to_use_pkgsrc_on_solaris/ , perhaps the only thing we do not have but need is SUNWsprot.&lt;br /&gt;
&lt;br /&gt;
Mounting iso images in solaris: https://blogs.oracle.com/gerhardhofweber/entry/mounting_iso_images_in_solaris&lt;br /&gt;
Uses lofiadm to make a mountable device for 'mount -F hsfs'&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
# mkdir -p /iso/sol-10-u10-ga2-sparc&lt;br /&gt;
# lofiadm -a /var/tmp/sol-10-u10-ga2-sparc-dvd.iso&lt;br /&gt;
/dev/lofi/1&lt;br /&gt;
# mount -F hsfs -o ro /dev/lofi/1 /iso/sol-10-u10-ga2-sparc&lt;br /&gt;
}}}&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4854</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4854"/>
				<updated>2012-10-02T20:32:54Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;br /&gt;
&lt;br /&gt;
Per http://wiki.netbsd.org/pkgsrc/how_to_use_pkgsrc_on_solaris/ , perhaps the only thing we do not have but need is SUNWsprot.&lt;br /&gt;
&lt;br /&gt;
Mounting iso images in solaris: https://blogs.oracle.com/gerhardhofweber/entry/mounting_iso_images_in_solaris&lt;br /&gt;
Uses lofiadm to make a mountable device for 'mount -F hsfs'&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4846</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4846"/>
				<updated>2012-10-02T15:16:30Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;br /&gt;
&lt;br /&gt;
Per http://wiki.netbsd.org/pkgsrc/how_to_use_pkgsrc_on_solaris/ , perhaps the only thing we do not have but need is SUNWsprot.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4844</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4844"/>
				<updated>2012-10-01T22:45:58Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;br /&gt;
&lt;br /&gt;
This requires several components from Oracle, and some things which are not in the default path of /usr/sbin:/usr/bin&lt;br /&gt;
&lt;br /&gt;
I am making an /opt/pkgsrc/buildenv.sh to run that will set up PATH and other environment variables to make an appropriate build environment.  (This is done so as to not disrupt root's default PATH and clutter it with a bunch of stuff.)&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4843</id>
		<title>Solaris and pkgsrc</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Solaris_and_pkgsrc&amp;diff=4843"/>
				<updated>2012-10-01T21:25:46Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: New page: Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:  Get the pkgsrc repo locally and copy it over:  env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checko...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bootstrapping krbdev-sparc-build.mit.edu as a build slave with solaris 10:&lt;br /&gt;
&lt;br /&gt;
Get the pkgsrc repo locally and copy it over:&lt;br /&gt;
&lt;br /&gt;
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc&lt;br /&gt;
&lt;br /&gt;
I see the key fingerprint of anoncvs as:&lt;br /&gt;
&lt;br /&gt;
1024 a0:b1:35:d7:56:be:2c:30:78:b0:21:df:43:d9:64:5c anoncvs.netbsd.org,149.20.53.68 (RSA)&lt;br /&gt;
&lt;br /&gt;
I can't find a cvs binary from Oracle TechNet, hence the copying.&lt;br /&gt;
&lt;br /&gt;
On the server, drop it in /opt/pkgsrc&lt;br /&gt;
The next step, per http://www.netbsd.org/docs/pkgsrc/platforms.html is to run the bootstrap script.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4842</id>
		<title>Kerberos for Windows (KfW) Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4842"/>
				<updated>2012-09-19T21:20:16Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: more formatting tweaks to avoid splitting sentences.  More work still needed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Directions for producing an environment in which to build&lt;br /&gt;
Kerberos for Windows version 4&lt;br /&gt;
&lt;br /&gt;
Start with a clean Windows 7 installation (64-bit necessary?)&lt;br /&gt;
&lt;br /&gt;
(0) get a browser that you like/trust to validate SSL certs/etc.&lt;br /&gt;
&lt;br /&gt;
(1) Install MS Visual Studio 2010 Professional&lt;br /&gt;
    grab the Visual C++ 10.0 runtime for x86 and x64&lt;br /&gt;
    also the 64-bit prerequisites&lt;br /&gt;
    Documentation files not necessary&lt;br /&gt;
    Choose 'Visual C++ Development Settings' (probably doesn't matter)&lt;br /&gt;
    You should now have an 'HTML Help Workshop' entry within&lt;br /&gt;
    Program Files (x86).  This will get added to the path, later.&lt;br /&gt;
(2) Install the Windows SDK version 7.1&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=8279&lt;br /&gt;
    The download is over a non-https url by default, though the installer&lt;br /&gt;
    is signed by a Microsoft certificate.&lt;br /&gt;
    [Select all components (add application verifier, debugging tools,&lt;br /&gt;
     windows performance toolkit)]&lt;br /&gt;
    Finishing the installation brings up the Help Library Manager (installer?)&lt;br /&gt;
    but nothing should be necessary from that utility.&lt;br /&gt;
(3) Install the Utilities and SDK for UNIX-based Applications (amd64 if on a 64-bit system)&lt;br /&gt;
    First, enable the Windows feature &amp;quot;Subsystem for UNIX-based Applications&amp;quot;&lt;br /&gt;
    from the Control Panel.  (Programs [and Features] menu, &amp;quot;Turn on or off&lt;br /&gt;
    Windows features&amp;quot;, or similar.)&lt;br /&gt;
    Then visit (also available from the All Programs menu)&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?id=23754&lt;br /&gt;
    Again, this is a http-default page, and attempting to use SSL causes&lt;br /&gt;
    an error due to Akamai configuration.&lt;br /&gt;
    I have Version 10.0.6030.0 of the SUA, which claims to be for&lt;br /&gt;
    Windows Vista RTM/Windows Vista SP1/Windows Server 2008 RTM&lt;br /&gt;
    but appears to work fine on Windows 7.&lt;br /&gt;
    [The standard installation gives us awk, which may be all we need?]&lt;br /&gt;
(4) Install the Windows Installer XML Toolkit&lt;br /&gt;
    Tested with version 3.5; there is a 3.6 beta available as well.&lt;br /&gt;
    wix.sourceforge.net --&amp;gt; wix.codeplex.com/releases/view/60102&lt;br /&gt;
    These default to non-SSL urls; try to get&lt;br /&gt;
    https://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=wix&amp;amp;DownloadId=204417&amp;amp;FileTime=129409234222130000&amp;amp;Build=19194&lt;br /&gt;
    Install all components (the default setting).&lt;br /&gt;
(5) Update the system path to include some necessary utilities.&lt;br /&gt;
    This is something like&lt;br /&gt;
    Control Panel-&amp;gt;System-&amp;gt;Advanced System Settings-&amp;gt;Environment&lt;br /&gt;
    awk is in C:\Windows\SUA\bin&lt;br /&gt;
    But, you will need to make a *copy* (not link) of it named awk.exe in&lt;br /&gt;
    order for things to work properly.  Check the permissions so that everyone&lt;br /&gt;
    can read and execute it.&lt;br /&gt;
    Add the directory containing hhc.exe to the path:&lt;br /&gt;
    C:\Program Files (x86)\HTML Help Workshop&lt;br /&gt;
    Add C:\Program Files (x86)\Windows Installer XML v3.5\bin to the path&lt;br /&gt;
    to get candle.exe.&lt;br /&gt;
(6) Install a real Perl that can handle both forward-slash and backward-slash as path separators, e.g., ActivePerl or Strawberry Perl.&lt;br /&gt;
    I used Strawberry Perl, since its installer was downloadable over SSL and&lt;br /&gt;
    was digitally signed.&lt;br /&gt;
    I have strawberry_perl-5.14.2.1-64bit.msi&lt;br /&gt;
    Note that you may not have spaces in the path to the installation, so&lt;br /&gt;
    it installs to c:\strawberry by default.&lt;br /&gt;
&lt;br /&gt;
That should be enough for the build environment.&lt;br /&gt;
&lt;br /&gt;
To actually build an installer, fire up the Windows SDK 7.1 command prompt.&lt;br /&gt;
&lt;br /&gt;
(0) cmd /v to get delayed expansion of variables&lt;br /&gt;
&lt;br /&gt;
(1) Environment set-up&lt;br /&gt;
    set KRB_INSTALL_DIR=/path/to/an/obj/dir&lt;br /&gt;
    [set MIT_INTERNAL=1]&lt;br /&gt;
    [set NODEBUG=1]&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x86 [/release]&lt;br /&gt;
    set CPU=i386&lt;br /&gt;
(2) Build the 32-bit binaries&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake -f Makefile.in prep-windows&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(3) Build 32-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw32.msi&lt;br /&gt;
(4) 64-bit build&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x64 [/release]&lt;br /&gt;
    set CPU=AMD64&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake -f Makefile.in prep-windows [?]&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(5) Build 64-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw64.msi&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4841</id>
		<title>Kerberos for Windows (KfW) Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4841"/>
				<updated>2012-09-19T20:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: tweak formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Directions for producing an environment in which to build&lt;br /&gt;
Kerberos for Windows version 4&lt;br /&gt;
&lt;br /&gt;
Start with a clean Windows 7 installation (64-bit necessary?)&lt;br /&gt;
&lt;br /&gt;
(0) get a browser that you like/trust to validate SSL certs/etc.&lt;br /&gt;
&lt;br /&gt;
(1) Install MS Visual Studio 2010 Professional&lt;br /&gt;
    grab the Visual C++ 10.0 runtime for x86 and x64&lt;br /&gt;
    also the 64-bit prerequisites&lt;br /&gt;
    Documentation files not necessary&lt;br /&gt;
    Choose 'Visual C++ Development Settings' (probably doesn't matter)&lt;br /&gt;
    You should now have an 'HTML Help Workshop' entry within&lt;br /&gt;
    Program Files (x86).  This will get added to the path, later.&lt;br /&gt;
(2) Install the Windows SDK version 7.1&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=8279&lt;br /&gt;
    The download is over a non-https url by default, though the installer&lt;br /&gt;
    is signed by a Microsoft certificate.&lt;br /&gt;
    [Select all components (add application verifier, debugging tools,&lt;br /&gt;
     windows performance toolkit)]&lt;br /&gt;
    Finishing the installation brings up the Help Library Manager (installer?)&lt;br /&gt;
    but nothing should be necessary from that utility.&lt;br /&gt;
(3) Install the Utilities and SDK for UNIX-based Applications (amd64 if&lt;br /&gt;
    on a 64-bit system)&lt;br /&gt;
    First, enable the Windows feature &amp;quot;Subsystem for UNIX-based Applications&amp;quot;&lt;br /&gt;
    from the Control Panel.  (Programs [and Features] menu, &amp;quot;Turn on or off&lt;br /&gt;
    Windows features&amp;quot;, or similar.)&lt;br /&gt;
    Then visit (also available from the All Programs menu)&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?id=23754&lt;br /&gt;
    Again, this is a http-default page, and attempting to use SSL causes&lt;br /&gt;
    an error due to Akamai configuration.&lt;br /&gt;
    I have Version 10.0.6030.0 of the SUA, which claims to be for&lt;br /&gt;
    Windows Vista RTM/Windows Vista SP1/Windows Server 2008 RTM&lt;br /&gt;
    but appears to work fine on Windows 7.&lt;br /&gt;
    [The standard installation gives us awk, which may be all we need?]&lt;br /&gt;
(4) Install the Windows Installer XML Toolkit&lt;br /&gt;
    Tested with version 3.5; there is a 3.6 beta available as well.&lt;br /&gt;
    wix.sourceforge.net --&amp;gt; wix.codeplex.com/releases/view/60102&lt;br /&gt;
    These default to non-SSL urls; try to get&lt;br /&gt;
    https://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=wix&amp;amp;DownloadId=204417&amp;amp;FileTime=129409234222130000&amp;amp;Build=19194&lt;br /&gt;
    Install all components (the default setting).&lt;br /&gt;
(5) Update the system path to include some necessary utilities.&lt;br /&gt;
    This is something like&lt;br /&gt;
    Control Panel-&amp;gt;System-&amp;gt;Advanced System Settings-&amp;gt;Environment&lt;br /&gt;
    awk is in C:\Windows\SUA\bin&lt;br /&gt;
    But, you will need to make a *copy* (not link) of it named awk.exe in&lt;br /&gt;
    order for things to work properly.  Check the permissions so that everyone&lt;br /&gt;
    can read and execute it.&lt;br /&gt;
    Add the directory containing hhc.exe to the path:&lt;br /&gt;
    C:\Program Files (x86)\HTML Help Workshop&lt;br /&gt;
    Add C:\Program Files (x86)\Windows Installer XML v3.5\bin to the path&lt;br /&gt;
    to get candle.exe.&lt;br /&gt;
(6) Install a real Perl that can handle both forward-slash and backward-slash&lt;br /&gt;
    as path separators, e.g., ActivePerl or Strawberry Perl.&lt;br /&gt;
    I used Strawberry Perl, since its installer was downloadable over SSL and&lt;br /&gt;
    was digitally signed.&lt;br /&gt;
    I have strawberry_perl-5.14.2.1-64bit.msi&lt;br /&gt;
    Note that you may not have spaces in the path to the installation, so&lt;br /&gt;
    it installs to c:\strawberry by default.&lt;br /&gt;
&lt;br /&gt;
That should be enough for the build environment.&lt;br /&gt;
&lt;br /&gt;
To actually build an installer, fire up the Windows SDK 7.1 command prompt.&lt;br /&gt;
&lt;br /&gt;
(0) cmd /v to get delayed expansion of variables&lt;br /&gt;
&lt;br /&gt;
(1) Environment set-up&lt;br /&gt;
    set KRB_INSTALL_DIR=/path/to/an/obj/dir&lt;br /&gt;
    [set MIT_INTERNAL=1]&lt;br /&gt;
    [set NODEBUG=1]&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x86 [/release]&lt;br /&gt;
    set CPU=i386&lt;br /&gt;
(2) Build the 32-bit binaries&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake -f Makefile.in prep-windows&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(3) Build 32-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw32.msi&lt;br /&gt;
(4) 64-bit build&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x64 [/release]&lt;br /&gt;
    set CPU=AMD64&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake -f Makefile.in prep-windows [?]&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(5) Build 64-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw64.msi&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4840</id>
		<title>Kerberos for Windows (KfW) Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4840"/>
				<updated>2012-09-19T20:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Import my notes onto the wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Directions for producing an environment in which to build&lt;br /&gt;
Kerberos for Windows version 4&lt;br /&gt;
&lt;br /&gt;
Start with a clean Windows 7 installation (64-bit necessary?)&lt;br /&gt;
&lt;br /&gt;
(0) get a browser that you like/trust to validate SSL certs/etc.&lt;br /&gt;
(1) Install MS Visual Studio 2010 Professional&lt;br /&gt;
    grab the Visual C++ 10.0 runtime for x86 and x64&lt;br /&gt;
    also the 64-bit prerequisites&lt;br /&gt;
    Documentation files not necessary&lt;br /&gt;
    Choose 'Visual C++ Development Settings' (probably doesn't matter)&lt;br /&gt;
    You should now have an 'HTML Help Workshop' entry within&lt;br /&gt;
    Program Files (x86).  This will get added to the path, later.&lt;br /&gt;
(2) Install the Windows SDK version 7.1&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=8279&lt;br /&gt;
    The download is over a non-https url by default, though the installer&lt;br /&gt;
    is signed by a Microsoft certificate.&lt;br /&gt;
    [Select all components (add application verifier, debugging tools,&lt;br /&gt;
     windows performance toolkit)]&lt;br /&gt;
    Finishing the installation brings up the Help Library Manager (installer?)&lt;br /&gt;
    but nothing should be necessary from that utility.&lt;br /&gt;
(3) Install the Utilities and SDK for UNIX-based Applications (amd64 if&lt;br /&gt;
    on a 64-bit system)&lt;br /&gt;
    First, enable the Windows feature &amp;quot;Subsystem for UNIX-based Applications&amp;quot;&lt;br /&gt;
    from the Control Panel.  (Programs [and Features] menu, &amp;quot;Turn on or off&lt;br /&gt;
    Windows features&amp;quot;, or similar.)&lt;br /&gt;
    Then visit (also available from the All Programs menu)&lt;br /&gt;
    http://www.microsoft.com/en-us/download/details.aspx?id=23754&lt;br /&gt;
    Again, this is a http-default page, and attempting to use SSL causes&lt;br /&gt;
    an error due to Akamai configuration.&lt;br /&gt;
    I have Version 10.0.6030.0 of the SUA, which claims to be for&lt;br /&gt;
    Windows Vista RTM/Windows Vista SP1/Windows Server 2008 RTM&lt;br /&gt;
    but appears to work fine on Windows 7.&lt;br /&gt;
    [The standard installation gives us awk, which may be all we need?]&lt;br /&gt;
(4) Install the Windows Installer XML Toolkit&lt;br /&gt;
    Tested with version 3.5; there is a 3.6 beta available as well.&lt;br /&gt;
    wix.sourceforge.net --&amp;gt; wix.codeplex.com/releases/view/60102&lt;br /&gt;
    These default to non-SSL urls; try to get&lt;br /&gt;
    https://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=wix&amp;amp;DownloadId=204417&amp;amp;FileTime=129409234222130000&amp;amp;Build=19194&lt;br /&gt;
    Install all components (the default setting).&lt;br /&gt;
(5) Update the system path to include some necessary utilities.&lt;br /&gt;
    This is something like&lt;br /&gt;
    Control Panel-&amp;gt;System-&amp;gt;Advanced System Settings-&amp;gt;Environment&lt;br /&gt;
    awk is in C:\Windows\SUA\bin&lt;br /&gt;
    But, you will need to make a *copy* (not link) of it named awk.exe in&lt;br /&gt;
    order for things to work properly.  Check the permissions so that everyone&lt;br /&gt;
    can read and execute it.&lt;br /&gt;
    Add the directory containing hhc.exe to the path:&lt;br /&gt;
    C:\Program Files (x86)\HTML Help Workshop&lt;br /&gt;
    Add C:\Program Files (x86)\Windows Installer XML v3.5\bin to the path&lt;br /&gt;
    to get candle.exe.&lt;br /&gt;
(6) Install a real Perl that can handle both forward-slash and backward-slash&lt;br /&gt;
    as path separators, e.g., ActivePerl or Strawberry Perl.&lt;br /&gt;
    I used Strawberry Perl, since its installer was downloadable over SSL and&lt;br /&gt;
    was digitally signed.&lt;br /&gt;
    I have strawberry_perl-5.14.2.1-64bit.msi&lt;br /&gt;
    Note that you may not have spaces in the path to the installation, so&lt;br /&gt;
    it installs to c:\strawberry by default.&lt;br /&gt;
&lt;br /&gt;
That should be enough for the build environment.&lt;br /&gt;
&lt;br /&gt;
To actually build an installer, fire up the Windows SDK 7.1 command prompt.&lt;br /&gt;
&lt;br /&gt;
(0) cmd /v to get delayed expansion of variables&lt;br /&gt;
&lt;br /&gt;
(1) Environment set-up&lt;br /&gt;
    set KRB_INSTALL_DIR=/path/to/an/obj/dir&lt;br /&gt;
    [set MIT_INTERNAL=1]&lt;br /&gt;
    [set NODEBUG=1]&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x86 [/release]&lt;br /&gt;
    set CPU=i386&lt;br /&gt;
(2) Build the 32-bit binaries&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake -f Makefile.in prep-windows&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(3) Build 32-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    [nmake clean]&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw32.msi&lt;br /&gt;
(4) 64-bit build&lt;br /&gt;
    \Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd /x64 [/release]&lt;br /&gt;
    set CPU=AMD64&lt;br /&gt;
    cd /path/to/krb5-tree/src&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake -f Makefile.in prep-windows [?]&lt;br /&gt;
    nmake&lt;br /&gt;
    nmake install&lt;br /&gt;
(5) Build 64-bit installer&lt;br /&gt;
    cd windows/installer/wix&lt;br /&gt;
    nmake clean&lt;br /&gt;
    nmake&lt;br /&gt;
    rename kfw.msi kfw64.msi&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4839</id>
		<title>Kerberos for Windows (KfW) Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4839"/>
				<updated>2012-09-19T20:03:34Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: New page for KfW 4.x build environment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_3.2.x_Build_Environment&amp;diff=4838</id>
		<title>Kerberos for Windows (KfW) 3.2.x Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_3.2.x_Build_Environment&amp;diff=4838"/>
				<updated>2012-09-19T20:02:26Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: this article is archival content, and is believed to describe the procedure needed to generate a build environment for Kerberos for Windows 3.2.x, which is no longer the current version.  The build environment for Kerberos for Windows 4.x is different and is described elsewhere.&lt;br /&gt;
&lt;br /&gt;
Kerberos for Windows (KfW) is a specialized distribution of MIT Kerberos targeting the Windows platform. This document describes how to setup your development environment to build KfW.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The KfW build is automated by a set of Perl scripts and uses a combination of GNU and Microsoft tools to assemble the final build. In the following sections, we’ll outline the required components to run the build system. &lt;br /&gt;
&lt;br /&gt;
===Source Control Access===&lt;br /&gt;
The Kerberos source tree is currently split over two source control systems. Current source is managed using Subversion (SVN), while legacy code is managed using the Concurrent Versioning System (CVS). The [http://www.cygwin.com/ Cygwin] distribution provides an SVN client that can be used with our Kerberized SVN repository.&lt;br /&gt;
&lt;br /&gt;
====Kerberized Access====&lt;br /&gt;
Both source control systems support Kerberos authentication. In order to execute the KfW build script, you must use the Kerberos authentication mechanism as the script is not designed to prompt for passwords. Unfortunately, neither the CVS nor SVN client natively supports Kerberos authentication. &lt;br /&gt;
&lt;br /&gt;
In order to provide Kerberized access for SVN, you must use a Kerberized SSH client in conjunction with the standard SVN client included with Cygwin. (In this guide, we will use a special build of '''PuTTY''' to accomplish this.) &lt;br /&gt;
&lt;br /&gt;
In order to provide Kerberized access for CVS, we will use a custom build of the CVS client that supports Kerberos authentication.&lt;br /&gt;
&lt;br /&gt;
===Required Tools===&lt;br /&gt;
====Source Control====&lt;br /&gt;
* CVS with Kerberos Support&lt;br /&gt;
* SVN &lt;br /&gt;
* PuTTY &lt;br /&gt;
&lt;br /&gt;
====Scripting Support====&lt;br /&gt;
* Cygwin (v1.5 or later)&lt;br /&gt;
** Provides the sed, awk, cat, rm, and find utilities.&lt;br /&gt;
* ActiveState Perl (v5.10.0.1005 or later)&lt;br /&gt;
&lt;br /&gt;
====Compilers and Libraries====&lt;br /&gt;
* Microsoft Visual Studio (v2005 SP1 or later)&lt;br /&gt;
* Microsoft Windows SDK (v6.1 or later)&lt;br /&gt;
&lt;br /&gt;
====Documentation Generation====&lt;br /&gt;
* Doxygen&lt;br /&gt;
* Microsoft HTML Help Workshop&lt;br /&gt;
* Microsoft Windows Help Authoring Kit&lt;br /&gt;
&lt;br /&gt;
====Installation Packagers====&lt;br /&gt;
* Windows Installer XML (WiX) toolset&lt;br /&gt;
* Nullsoft Scriptable Install System (NSIS)&lt;br /&gt;
&lt;br /&gt;
==Setting up Source Control Access==&lt;br /&gt;
In order to access the SVN repository, we will need to install and configure Cygwin, the KFW binaries (for Kerberized source control access), PuTTY, and a custom build of the CVS client.&lt;br /&gt;
&lt;br /&gt;
Please note: Prior to testing any of the configurations described below, please be sure that you have been granted permissions to access the SVN and CVS repositories. PuTTY will throw unintelligible errors if permissions have not been set properly.&lt;br /&gt;
&lt;br /&gt;
===Installing and Cygwin and SVN===&lt;br /&gt;
# Download a copy of the Cygwin installer [http://www.cygwin.com/ here]. Save it too your local machine (note the location, as this executable is required to make any modifications to you Cygwin distribution).&lt;br /&gt;
# Run '''setup.exe'''&lt;br /&gt;
# Click '''Next''' through the introduction and download screens, accepting the default values. &lt;br /&gt;
# When prompted, change the root directory of the Cygwin installation to '''C:\tools\cygwin''', and click '''Next'''.&lt;br /&gt;
# When choosing a directory to store the installation packages, you may accept the default, though this might place the files in temporary internet files directory. If you want these packages to be available for reinstallation at a later time, choose a more suitable directory (i.e. '''C:\cyginstall'''). Click '''Next'''.&lt;br /&gt;
# Leave the default connection settings, and click '''Next'''&lt;br /&gt;
# Choose a download site from the list, and click '''Next'''&lt;br /&gt;
# In the ''Choose Packages'' screen, mark the Devel/Subversion package for installation, and click '''Next'''. The installer will proceed to download and install the selected packages.&lt;br /&gt;
# Click '''Finish'''. The installer will close.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\cygwin\bin''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
# Open Windows Explorer and navigate to the Cygwin bin directory ('''C:\tools\cygwin\bin''').&lt;br /&gt;
# Delete '''awk.exe''' (this is a symbolic link that the Windows shell doesn't handle properly).&lt;br /&gt;
# Copy '''gawk.exe''' and rename it to '''awk.exe'''.&lt;br /&gt;
&lt;br /&gt;
===Installing the KfW Binaries===&lt;br /&gt;
If you are not currently using a pre-built version of KfW, you'll need to install one now in order to use Kerberized source control access.&lt;br /&gt;
&lt;br /&gt;
# Download a copy of the '''MIT Kerberos for Windows''' MSI installer [http://web.mit.edu/kerberos/dist/ here]. Run the MSI. &lt;br /&gt;
# Accept the default install options.&lt;br /&gt;
# Once setup completes, launch the '''Network Identity Manager (NIM)''' from the '''Kerberos for Windows''' folder in the '''Start Menu'''. By default, it should be configured for the ATHENA.MIT.EDU realm.&lt;br /&gt;
# Create new credentials using you Athena username and password, and minimize NIM (this should hide it in the taskbar).&lt;br /&gt;
&lt;br /&gt;
===Installing PuTTY===&lt;br /&gt;
PuTTY will provide the Kerberized SSH connection to our SVN repository.&lt;br /&gt;
# Download a copy of the '''PuTTY with GSSAPI Extensions''' archive [http://www.sweb.cz/v_t_m/putty/PuTTY-0.58-GSSAPI-2005-07-24.zip here]. Note, there are several distributions of PuTTY that support Kerberos. You may choose the one that works best for you.&lt;br /&gt;
# Unzip the archive to '''C:\tools\putty'''.&lt;br /&gt;
# Launch '''C:\tools\putty\putty.exe'''.&lt;br /&gt;
# Using the tree on the left, navigate to the '''Connection -&amp;gt; Data''' screen and enter your Athena username as the '''Auto-login username'''.&lt;br /&gt;
# Open the '''Connection --&amp;gt; SSH --&amp;gt; Auth screen'''. In Authentication Methods, select '''Attempt &amp;quot;keyboard-interactive&amp;quot; auth (SSH-2)''' and '''Attempt Kerberos 5 GSSAPI/SSPI auth (SSH-2)'''. In Authentication parameters, select '''Allow Kerberos 5 ticket forwarding in GSSAPI/SSF''' and enter '''ATHENA.MIT.EDU''' as the '''Server realm'''.&lt;br /&gt;
# Open the '''Session''' screen. Select (highlight) '''Default Settings''' from the list and click '''Save'''.&lt;br /&gt;
# Close the PuTTY configuration windows.&lt;br /&gt;
&lt;br /&gt;
===Configuring SVN &amp;amp; PuTTY===&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\putty''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
# Under the '''System Variables''' list, add a '''SVN_SSH''' variable and give it the value '''plink.exe'''.&lt;br /&gt;
# Create a directory to house a temporary SVN snapshot (i.e. '''C:\kfw\svn''').&lt;br /&gt;
# Open the Command Prompt ('''Start -&amp;gt; Run -&amp;gt; cmd''') and type: &lt;br /&gt;
#:&amp;lt;code&amp;gt;plink svn.mit.edu&amp;lt;/code&amp;gt;&lt;br /&gt;
#:Please note, it's important to run plink once before attempting to use it with SVN, because when connecting to the server for the first time there will be interactive prompts that SVN does not support.&lt;br /&gt;
# You may be prompted to add the server to your trusted list. If so, type '''y''' and hit '''Enter'''. Once the connection completes, hit '''Ctrl+C''' to end plink. It should ''not'' prompt you for a password at any time. If so, your Kerberos credentials have not been configured correctly or have expired.&lt;br /&gt;
# Now that we've confirmed plink is working with a Kerberized connection, we need to checkout a snapshot of the SVN repository. In the Command Prompt type: &lt;br /&gt;
#:&amp;lt;code&amp;gt;svn co svn+ssh://svn.mit.edu/krb5/trunk C:\kfw\svn&amp;lt;/code&amp;gt;&lt;br /&gt;
If your SVN client is properly configured, you should get a complete snapshot of the Krb5 trunk from the SVN repository, now located in C:\kfw\svn (or another directory of your choosing).&lt;br /&gt;
&lt;br /&gt;
===Installing CVS===&lt;br /&gt;
# Download a copy of CVS that supports Kerberos authentication. While there doesn't appear to be a readily accessible CVS client distribution that supports Kerberos, you can use the cvs client found [http://web.mit.edu/rsilk/Public/Kerberos/Utils/cvs.exe here].&lt;br /&gt;
# '''Move''' the file to your Cygwin binary directory (i.e.''' C:\tools\cygwin\bin''').&lt;br /&gt;
&lt;br /&gt;
==Configuring the Build Tools==&lt;br /&gt;
Now that we have access to the repositories and have a snapshot of the SVN trunk, we need to install the required Microsoft libraries. We also need to install ActiveState Perl in order to run the build script. Finally, we need to install the remaining build tools required for documentation generation and packaging.&lt;br /&gt;
&lt;br /&gt;
===Configuring Microsoft Visual Studio===&lt;br /&gt;
This guide assumes you have a working version of Microsoft Visual Studio 2005 Standard or later. Be sure to install the 64 bit libraries in addition to the standard 23 bit libraries if you intend to build for both architectures.&lt;br /&gt;
&lt;br /&gt;
===Installing the Microsoft Windows SDK===&lt;br /&gt;
# Download a copy of the '''Microsoft Windows SDK''' (version 6.1 or later) [http://www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options (though you may need to select the 64 bit libraries if desired). &lt;br /&gt;
&lt;br /&gt;
===Installing ActiveState Perl===&lt;br /&gt;
# Download a copy of '''ActiveState Perl''' (currently version 5.10.0.1005) [http://www.activestate.com/activeperl/downloads/ here]. &lt;br /&gt;
# Run the installer, accepting all default options. This should automatically add the Perl directory to your system path.&lt;br /&gt;
&lt;br /&gt;
===Installing Microsoft HTML Help Workshop===&lt;br /&gt;
# Download a copy of '''Microsoft HTML Help Workshop''' (currently version 1.3) [http://go.microsoft.com/fwlink/?linkid=14188 here].&lt;br /&gt;
# Run the installer, accepting all default options. Please note, the installer may complain that you already have a newer version of Help Workshop installed. Ignore this error; the installer will complete successfully..&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Fles\HTML Help Workshop''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing the Windows Help Authoring Kit===&lt;br /&gt;
Depending on your build configuration, you may also need the '''Windows Help Authoring Kit'''. &lt;br /&gt;
# Download a copy of the '''Windows Help Authoring Kit''' [http://www.microsoft.com/downloads/details.aspx?FamilyID=34D35502-4DE9-4676-952C-34CC7F64F098&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options. &lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Fles\Help Workshop''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing Doxygen===&lt;br /&gt;
# Download a copy of the '''Doxygen distribution for Windows''' (currently version 1.5.9) [http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc here].&lt;br /&gt;
# Run the installer, accepting all default options. This should automatically add the Doxygen directory to your system path.&lt;br /&gt;
&lt;br /&gt;
===Installing WiX===&lt;br /&gt;
# Download a copy of the Windows Install XML ('''WiX''') core toolset (currently version 2.0) [http://wix.sourceforge.net/downloadv2.html here].&lt;br /&gt;
# Unzip the archive to '''C:\tools\wix'''.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\wix''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing NSIS===&lt;br /&gt;
# Download a copy of the Nullsoft Scriptable Install System (NSIS - currently version 2.45) [http://nsis.sourceforge.net/Download here].&lt;br /&gt;
# Run installer, accepting all default options.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Files\NSIS''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing Windows Support Tools===&lt;br /&gt;
On some machines you may need to install the '''Windows XP SP2 Support Tools''' package to get the '''filever.exe''' utility (which is currently required by the build script). &lt;br /&gt;
# Download a copy of the '''Windows XP SP2 Support Tools''' package [http://www.microsoft.com/downloads/details.aspx?FamilyID=49ae8576-9bb9-4126-9761-ba8011fabf38&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_3.2.x_Build_Environment&amp;diff=4836</id>
		<title>Kerberos for Windows (KfW) 3.2.x Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_3.2.x_Build_Environment&amp;diff=4836"/>
				<updated>2012-09-19T19:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Kerberos for Windows (KfW) Build Environment moved to Kerberos for Windows (KfW) 3.2.x Build Environment: The build environment requirements will change for KfW 4.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kerberos for Windows (KfW) is a specialized distribution of MIT Kerberos targeting the Windows platform. This document describes how to setup your development environment to build KfW.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The KfW build is automated by a set of Perl scripts and uses a combination of GNU and Microsoft tools to assemble the final build. In the following sections, we’ll outline the required components to run the build system. &lt;br /&gt;
&lt;br /&gt;
===Source Control Access===&lt;br /&gt;
The Kerberos source tree is currently split over two source control systems. Current source is managed using Subversion (SVN), while legacy code is managed using the Concurrent Versioning System (CVS). The [http://www.cygwin.com/ Cygwin] distribution provides an SVN client that can be used with our Kerberized SVN repository.&lt;br /&gt;
&lt;br /&gt;
====Kerberized Access====&lt;br /&gt;
Both source control systems support Kerberos authentication. In order to execute the KfW build script, you must use the Kerberos authentication mechanism as the script is not designed to prompt for passwords. Unfortunately, neither the CVS nor SVN client natively supports Kerberos authentication. &lt;br /&gt;
&lt;br /&gt;
In order to provide Kerberized access for SVN, you must use a Kerberized SSH client in conjunction with the standard SVN client included with Cygwin. (In this guide, we will use a special build of '''PuTTY''' to accomplish this.) &lt;br /&gt;
&lt;br /&gt;
In order to provide Kerberized access for CVS, we will use a custom build of the CVS client that supports Kerberos authentication.&lt;br /&gt;
&lt;br /&gt;
===Required Tools===&lt;br /&gt;
====Source Control====&lt;br /&gt;
* CVS with Kerberos Support&lt;br /&gt;
* SVN &lt;br /&gt;
* PuTTY &lt;br /&gt;
&lt;br /&gt;
====Scripting Support====&lt;br /&gt;
* Cygwin (v1.5 or later)&lt;br /&gt;
** Provides the sed, awk, cat, rm, and find utilities.&lt;br /&gt;
* ActiveState Perl (v5.10.0.1005 or later)&lt;br /&gt;
&lt;br /&gt;
====Compilers and Libraries====&lt;br /&gt;
* Microsoft Visual Studio (v2005 SP1 or later)&lt;br /&gt;
* Microsoft Windows SDK (v6.1 or later)&lt;br /&gt;
&lt;br /&gt;
====Documentation Generation====&lt;br /&gt;
* Doxygen&lt;br /&gt;
* Microsoft HTML Help Workshop&lt;br /&gt;
* Microsoft Windows Help Authoring Kit&lt;br /&gt;
&lt;br /&gt;
====Installation Packagers====&lt;br /&gt;
* Windows Installer XML (WiX) toolset&lt;br /&gt;
* Nullsoft Scriptable Install System (NSIS)&lt;br /&gt;
&lt;br /&gt;
==Setting up Source Control Access==&lt;br /&gt;
In order to access the SVN repository, we will need to install and configure Cygwin, the KFW binaries (for Kerberized source control access), PuTTY, and a custom build of the CVS client.&lt;br /&gt;
&lt;br /&gt;
Please note: Prior to testing any of the configurations described below, please be sure that you have been granted permissions to access the SVN and CVS repositories. PuTTY will throw unintelligible errors if permissions have not been set properly.&lt;br /&gt;
&lt;br /&gt;
===Installing and Cygwin and SVN===&lt;br /&gt;
# Download a copy of the Cygwin installer [http://www.cygwin.com/ here]. Save it too your local machine (note the location, as this executable is required to make any modifications to you Cygwin distribution).&lt;br /&gt;
# Run '''setup.exe'''&lt;br /&gt;
# Click '''Next''' through the introduction and download screens, accepting the default values. &lt;br /&gt;
# When prompted, change the root directory of the Cygwin installation to '''C:\tools\cygwin''', and click '''Next'''.&lt;br /&gt;
# When choosing a directory to store the installation packages, you may accept the default, though this might place the files in temporary internet files directory. If you want these packages to be available for reinstallation at a later time, choose a more suitable directory (i.e. '''C:\cyginstall'''). Click '''Next'''.&lt;br /&gt;
# Leave the default connection settings, and click '''Next'''&lt;br /&gt;
# Choose a download site from the list, and click '''Next'''&lt;br /&gt;
# In the ''Choose Packages'' screen, mark the Devel/Subversion package for installation, and click '''Next'''. The installer will proceed to download and install the selected packages.&lt;br /&gt;
# Click '''Finish'''. The installer will close.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\cygwin\bin''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
# Open Windows Explorer and navigate to the Cygwin bin directory ('''C:\tools\cygwin\bin''').&lt;br /&gt;
# Delete '''awk.exe''' (this is a symbolic link that the Windows shell doesn't handle properly).&lt;br /&gt;
# Copy '''gawk.exe''' and rename it to '''awk.exe'''.&lt;br /&gt;
&lt;br /&gt;
===Installing the KfW Binaries===&lt;br /&gt;
If you are not currently using a pre-built version of KfW, you'll need to install one now in order to use Kerberized source control access.&lt;br /&gt;
&lt;br /&gt;
# Download a copy of the '''MIT Kerberos for Windows''' MSI installer [http://web.mit.edu/kerberos/dist/ here]. Run the MSI. &lt;br /&gt;
# Accept the default install options.&lt;br /&gt;
# Once setup completes, launch the '''Network Identity Manager (NIM)''' from the '''Kerberos for Windows''' folder in the '''Start Menu'''. By default, it should be configured for the ATHENA.MIT.EDU realm.&lt;br /&gt;
# Create new credentials using you Athena username and password, and minimize NIM (this should hide it in the taskbar).&lt;br /&gt;
&lt;br /&gt;
===Installing PuTTY===&lt;br /&gt;
PuTTY will provide the Kerberized SSH connection to our SVN repository.&lt;br /&gt;
# Download a copy of the '''PuTTY with GSSAPI Extensions''' archive [http://www.sweb.cz/v_t_m/putty/PuTTY-0.58-GSSAPI-2005-07-24.zip here]. Note, there are several distributions of PuTTY that support Kerberos. You may choose the one that works best for you.&lt;br /&gt;
# Unzip the archive to '''C:\tools\putty'''.&lt;br /&gt;
# Launch '''C:\tools\putty\putty.exe'''.&lt;br /&gt;
# Using the tree on the left, navigate to the '''Connection -&amp;gt; Data''' screen and enter your Athena username as the '''Auto-login username'''.&lt;br /&gt;
# Open the '''Connection --&amp;gt; SSH --&amp;gt; Auth screen'''. In Authentication Methods, select '''Attempt &amp;quot;keyboard-interactive&amp;quot; auth (SSH-2)''' and '''Attempt Kerberos 5 GSSAPI/SSPI auth (SSH-2)'''. In Authentication parameters, select '''Allow Kerberos 5 ticket forwarding in GSSAPI/SSF''' and enter '''ATHENA.MIT.EDU''' as the '''Server realm'''.&lt;br /&gt;
# Open the '''Session''' screen. Select (highlight) '''Default Settings''' from the list and click '''Save'''.&lt;br /&gt;
# Close the PuTTY configuration windows.&lt;br /&gt;
&lt;br /&gt;
===Configuring SVN &amp;amp; PuTTY===&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\putty''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
# Under the '''System Variables''' list, add a '''SVN_SSH''' variable and give it the value '''plink.exe'''.&lt;br /&gt;
# Create a directory to house a temporary SVN snapshot (i.e. '''C:\kfw\svn''').&lt;br /&gt;
# Open the Command Prompt ('''Start -&amp;gt; Run -&amp;gt; cmd''') and type: &lt;br /&gt;
#:&amp;lt;code&amp;gt;plink svn.mit.edu&amp;lt;/code&amp;gt;&lt;br /&gt;
#:Please note, it's important to run plink once before attempting to use it with SVN, because when connecting to the server for the first time there will be interactive prompts that SVN does not support.&lt;br /&gt;
# You may be prompted to add the server to your trusted list. If so, type '''y''' and hit '''Enter'''. Once the connection completes, hit '''Ctrl+C''' to end plink. It should ''not'' prompt you for a password at any time. If so, your Kerberos credentials have not been configured correctly or have expired.&lt;br /&gt;
# Now that we've confirmed plink is working with a Kerberized connection, we need to checkout a snapshot of the SVN repository. In the Command Prompt type: &lt;br /&gt;
#:&amp;lt;code&amp;gt;svn co svn+ssh://svn.mit.edu/krb5/trunk C:\kfw\svn&amp;lt;/code&amp;gt;&lt;br /&gt;
If your SVN client is properly configured, you should get a complete snapshot of the Krb5 trunk from the SVN repository, now located in C:\kfw\svn (or another directory of your choosing).&lt;br /&gt;
&lt;br /&gt;
===Installing CVS===&lt;br /&gt;
# Download a copy of CVS that supports Kerberos authentication. While there doesn't appear to be a readily accessible CVS client distribution that supports Kerberos, you can use the cvs client found [http://web.mit.edu/rsilk/Public/Kerberos/Utils/cvs.exe here].&lt;br /&gt;
# '''Move''' the file to your Cygwin binary directory (i.e.''' C:\tools\cygwin\bin''').&lt;br /&gt;
&lt;br /&gt;
==Configuring the Build Tools==&lt;br /&gt;
Now that we have access to the repositories and have a snapshot of the SVN trunk, we need to install the required Microsoft libraries. We also need to install ActiveState Perl in order to run the build script. Finally, we need to install the remaining build tools required for documentation generation and packaging.&lt;br /&gt;
&lt;br /&gt;
===Configuring Microsoft Visual Studio===&lt;br /&gt;
This guide assumes you have a working version of Microsoft Visual Studio 2005 Standard or later. Be sure to install the 64 bit libraries in addition to the standard 23 bit libraries if you intend to build for both architectures.&lt;br /&gt;
&lt;br /&gt;
===Installing the Microsoft Windows SDK===&lt;br /&gt;
# Download a copy of the '''Microsoft Windows SDK''' (version 6.1 or later) [http://www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options (though you may need to select the 64 bit libraries if desired). &lt;br /&gt;
&lt;br /&gt;
===Installing ActiveState Perl===&lt;br /&gt;
# Download a copy of '''ActiveState Perl''' (currently version 5.10.0.1005) [http://www.activestate.com/activeperl/downloads/ here]. &lt;br /&gt;
# Run the installer, accepting all default options. This should automatically add the Perl directory to your system path.&lt;br /&gt;
&lt;br /&gt;
===Installing Microsoft HTML Help Workshop===&lt;br /&gt;
# Download a copy of '''Microsoft HTML Help Workshop''' (currently version 1.3) [http://go.microsoft.com/fwlink/?linkid=14188 here].&lt;br /&gt;
# Run the installer, accepting all default options. Please note, the installer may complain that you already have a newer version of Help Workshop installed. Ignore this error; the installer will complete successfully..&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Fles\HTML Help Workshop''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing the Windows Help Authoring Kit===&lt;br /&gt;
Depending on your build configuration, you may also need the '''Windows Help Authoring Kit'''. &lt;br /&gt;
# Download a copy of the '''Windows Help Authoring Kit''' [http://www.microsoft.com/downloads/details.aspx?FamilyID=34D35502-4DE9-4676-952C-34CC7F64F098&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options. &lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Fles\Help Workshop''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing Doxygen===&lt;br /&gt;
# Download a copy of the '''Doxygen distribution for Windows''' (currently version 1.5.9) [http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc here].&lt;br /&gt;
# Run the installer, accepting all default options. This should automatically add the Doxygen directory to your system path.&lt;br /&gt;
&lt;br /&gt;
===Installing WiX===&lt;br /&gt;
# Download a copy of the Windows Install XML ('''WiX''') core toolset (currently version 2.0) [http://wix.sourceforge.net/downloadv2.html here].&lt;br /&gt;
# Unzip the archive to '''C:\tools\wix'''.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\tools\wix''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing NSIS===&lt;br /&gt;
# Download a copy of the Nullsoft Scriptable Install System (NSIS - currently version 2.45) [http://nsis.sourceforge.net/Download here].&lt;br /&gt;
# Run installer, accepting all default options.&lt;br /&gt;
# Open the '''Control Panel -&amp;gt; System''' applet. Click the '''Advanced''' tab and click '''Environment Variables'''.&lt;br /&gt;
# Under the '''System Variables''' list, double-click '''Path''' (possibly listed as '''PATH'''), add a semicolon after the last entry and add '''C:\Program Files\NSIS''' to the variable. Click '''OK''' on each window to close it, accepting changes.&lt;br /&gt;
&lt;br /&gt;
===Installing Windows Support Tools===&lt;br /&gt;
On some machines you may need to install the '''Windows XP SP2 Support Tools''' package to get the '''filever.exe''' utility (which is currently required by the build script). &lt;br /&gt;
# Download a copy of the '''Windows XP SP2 Support Tools''' package [http://www.microsoft.com/downloads/details.aspx?FamilyID=49ae8576-9bb9-4126-9761-ba8011fabf38&amp;amp;displaylang=en here].&lt;br /&gt;
# Run the installer, accepting all default options.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4837</id>
		<title>Kerberos for Windows (KfW) Build Environment</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_(KfW)_Build_Environment&amp;diff=4837"/>
				<updated>2012-09-19T19:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Kerberos for Windows (KfW) Build Environment moved to Kerberos for Windows (KfW) 3.2.x Build Environment: The build environment requirements will change for KfW 4.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Kerberos for Windows (KfW) 3.2.x Build Environment]]&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4835</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4835"/>
				<updated>2012-09-19T19:40:48Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP/IMAP via Thunderbird (must disable SSPI though?)&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP via, e.g., Pidgin&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
The NSIS upgrade path is a separate codepath and should be tested separately.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls no longer reflects the underlying krb5 version (instead using the KfW version); this may not actually be a bug.&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* (Version) upgrades that go from 64-bit to 32-bit leave 64-bit binaries around but otherwise succeed.&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth unless you disable SSPI&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4830</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4830"/>
				<updated>2012-09-17T19:21:03Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: we resolved some issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP/IMAP via Thunderbird (must disable SSPI though?)&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP via, e.g., Pidgin&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
The NSIS upgrade path is a separate codepath and should be tested separately.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth unless you disable SSPI&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4829</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4829"/>
				<updated>2012-09-17T19:19:49Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP/IMAP via Thunderbird (must disable SSPI though?)&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP via, e.g., Pidgin&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
The NSIS upgrade path is a separate codepath and should be tested separately.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4811</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4811"/>
				<updated>2012-08-22T17:04:43Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
The NSIS upgrade path is a separate codepath and should be tested separately.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4810</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4810"/>
				<updated>2012-08-22T16:12:29Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth&lt;br /&gt;
* Our DllMain attach/detach handler spews to the terminal when running command-line utilities.  Possibly other debug print statements, too.&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4808</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4808"/>
				<updated>2012-08-20T23:13:17Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Move some issues into the (new) &amp;quot;we think they're fixed&amp;quot; category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth&lt;br /&gt;
&lt;br /&gt;
Issues that we believe to be resolved:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so.  There may be cases in which it just kills processes without prompting, which may still be a bug.&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;br /&gt;
* Uninitialized (NULL) TLS pointers that were most prominent on multi-processor machines, causing internal ccache errors that were reported as &amp;quot;unknown error&amp;quot; due to another minor bug.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4803</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4803"/>
				<updated>2012-08-16T21:42:05Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;br /&gt;
* Thunderbird cannot do GSSAPI auth&lt;br /&gt;
* There is a report of crashes on a multiprocessor machine unless CPU-pinning is used&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4802</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4802"/>
				<updated>2012-08-15T00:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
When starting from 3.2, it probably suffices to test the Secure Endpoints versions once only, and assume that there will not be future changes to 4.0 which cause the upgrade process to fail for the SE version but not the MIT-distributed version.&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4801</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4801"/>
				<updated>2012-08-14T22:06:26Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code).  The wix-users archives suggest that Util:CloseApplication may be useful to do this in pure WiX instead of a custom element&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4800</id>
		<title>Kerberos for Windows Release Engineering</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Kerberos_for_Windows_Release_Engineering&amp;diff=4800"/>
				<updated>2012-08-14T21:54:17Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: New page: Release Engineering notes for the Kerberos for Windows 4.0.0 release  Software to test against new builds: * SapGUI * OpenAFS * SecureCRT (and SecureFX?) * SPNEGO (in multiple browsers?) *...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Engineering notes for the Kerberos for Windows 4.0.0 release&lt;br /&gt;
&lt;br /&gt;
Software to test against new builds:&lt;br /&gt;
* SapGUI&lt;br /&gt;
* OpenAFS&lt;br /&gt;
* SecureCRT (and SecureFX?)&lt;br /&gt;
* SPNEGO (in multiple browsers?)&lt;br /&gt;
* Adobe Keyserver a.k.a the Sassafras key client&lt;br /&gt;
* SMTP in some form?&lt;br /&gt;
* LDAP in some form?&lt;br /&gt;
* XMPP in some form (pidgin?)?&lt;br /&gt;
&lt;br /&gt;
Upgrades scenarios to test:&lt;br /&gt;
* 32-bit to 32-bit, from 3.2&lt;br /&gt;
* 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit and 64-bit to 64-bit, from 3.2&lt;br /&gt;
* 32-bit to 64-bit, from 4.0&lt;br /&gt;
* 64-bit to 32-bit, from 4.0&lt;br /&gt;
&lt;br /&gt;
Current known issues:&lt;br /&gt;
* The uninstaller prompts to kill running processes but does not do succeed in doing so&lt;br /&gt;
* The upgrade procedure attempts to kill running processes but does not succeed in doing so (these two may be sharing most of the code)&lt;br /&gt;
* The version number implanted in various dlls may no longer reflect the underlying krb5 version (instead using the KfW version)&lt;br /&gt;
* windows/README is outdated&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=4748</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=4748"/>
				<updated>2012-07-17T19:03:12Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Mention desire for examples of API usage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrix of Document-Type VS Intended Readership&lt;br /&gt;
|-&lt;br /&gt;
! Doc-type/Reader&lt;br /&gt;
! Architectural Guide&lt;br /&gt;
! Setup &amp;amp; Config of Kerberos&lt;br /&gt;
! Admin &amp;amp; Operations of Kerberos&lt;br /&gt;
! Custom Build&lt;br /&gt;
! API Description&lt;br /&gt;
! API Details&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| End-users || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Architects || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|System Admins || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Application Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|GSSAPI Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Kerberos Developers || || || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || ready for review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || ready for review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin ||&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential&amp;lt;/ul&amp;gt;|| TY || 2012-04-27 ||need examples ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || &lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || ready for review&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-07-15|| ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Replication&amp;lt;/ul&amp;gt;|| ZT|| || ||ready for review&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-10-01|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-10-01|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| NW || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || ready for review&lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Trace logging&amp;lt;/ul&amp;gt;||GH ||2012-03-22|| || ready for review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid)&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||ready for review&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
===Most commonly used API functions (in alphabetical order)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! API&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API funcitons.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=4718</id>
		<title>Test suite</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=4718"/>
				<updated>2012-07-03T19:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: reverse-resolution test suite issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lore]]&lt;br /&gt;
== Additional build requirements for running &amp;quot;make check&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
The following additional software (in addition to the requirements at [[Building]]) is needed to run &amp;quot;make check&amp;quot;.  As for the packages listed at [[Building]], the software packages are identified by their Debian / Ubuntu package names.&lt;br /&gt;
&lt;br /&gt;
* csh (for some of the Berkeley DB tests)&lt;br /&gt;
* dejagnu (for many dejagnu-based tests)&lt;br /&gt;
* expect (needed by dejagnu)&lt;br /&gt;
* g++ (for some API sanity checks)&lt;br /&gt;
* portmap (for lib/rpc/unit-test)&lt;br /&gt;
* tcl (needed by expect)&lt;br /&gt;
* tcl-dev (to build some kadm5 test programs)&lt;br /&gt;
&lt;br /&gt;
== Known test suite issues ==&lt;br /&gt;
&lt;br /&gt;
On Linux systems, sometimes the &amp;lt;code&amp;gt;--disable-rpath&amp;lt;/code&amp;gt; option to &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; is required in order to avoid problems with previously-installed versions of MIT krb5.  Alternatively, you can run &amp;quot;make install&amp;quot; before &amp;quot;make check&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Prior to krb5-1.9, calls to krb5_c_random_os_entropy that pass the value 1 in the &amp;lt;code&amp;gt;strong&amp;lt;/code&amp;gt; argument (which causes the library to read from the strong OS random number source) can cause stalls and timeouts in the test suite.  Changing those calls to pass 0 instead will reduce the stalls.  Starting in krb5-1.9, we disable the reading of strong random numbers during tests.  This is primarily a problem on Linux systems.&lt;br /&gt;
&lt;br /&gt;
Prior to krb5-1.9, the test suite tripped a bug where Dejagnu breaks the autoloading required by modern versions of Tcl. This manifests as errors such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR: (DejaGnu) proc &amp;quot;::tcl::tm::UnknownHandler ::tclPkgUnknown msgcat 1.4&amp;quot; does not exist.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Dejagnu maintainers are aware of this problem (http://lists.gnu.org/archive/html/dejagnu/2011-03/msg00002.html), but as of June 2011 there doesn't seem to be a release containing the fix.  Since krb5-1.9, the offending piece of Tcl code (&amp;lt;code&amp;gt;clock format [clock seconds]&amp;lt;/code&amp;gt;) is no longer used. A fix has been applied to the krb5-1.8 branch as well. ({{bug|6926}})&lt;br /&gt;
&lt;br /&gt;
If an existing kdc.conf exists in the &amp;quot;installed&amp;quot; location, it can disrupt the automated tests, especially if it contains syntax errors.&lt;br /&gt;
&lt;br /&gt;
On older Debian or Ubuntu systems, a bug in &amp;lt;code&amp;gt;expect&amp;lt;/code&amp;gt; could cause stalls in the dejagnu parts of the test suite. It is documented at http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421187&amp;lt;!-- --&amp;gt;. Current stable releases of Debian and Ubuntu no longer have an affected version of the &amp;lt;code&amp;gt;expect&amp;lt;/code&amp;gt; package.&lt;br /&gt;
&lt;br /&gt;
As of July 2012, portions of the test suite will fail if the current hostname does not properly resolve (e.g., if a hostname is set, but the IP address assigned via DHCP corresponds to a different name); setting explicit entries in &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; should be an effective workaround (an IPv6 entry may be needed in addition to an IPv4 entry).&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4717</id>
		<title>Manual Testing</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Manual_Testing&amp;diff=4717"/>
				<updated>2012-07-03T19:30:40Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes manual testing procedures.  There are two reasons these exist:&lt;br /&gt;
&lt;br /&gt;
# Manual testing is sometimes simpler than running an automated test and instrumenting it.&lt;br /&gt;
# In some cases we have a manual testing procedure for part of the code, but not an automated test.&lt;br /&gt;
&lt;br /&gt;
We do have an automated [[Test suite]].&lt;br /&gt;
&lt;br /&gt;
==Basic Test KDC Setup==&lt;br /&gt;
&lt;br /&gt;
Test KDCs are a crucial building block of testing.  You can set one up easily by running &amp;quot;make testrealm&amp;quot; in the top level of a build tree, or you can follow these steps to set one up by hand:&lt;br /&gt;
&lt;br /&gt;
1. Pick a name for your test KDC; this example will assume EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
2. Do a build and install of the krb5 sources into some prefix; this example will assume /usr/local, but anywhere is fine.  Put the prefix's bin and sbin directories in your path, or use full pathnames for the commands below.&lt;br /&gt;
&lt;br /&gt;
3. Pick two port numbers, for the KDC and admin server.  This example will assume 50000 and 50001.&lt;br /&gt;
&lt;br /&gt;
4. Set up a krb5.conf file somewhere; this example will assume /usr/local/etc/krb5.conf.  Make it look something like:&lt;br /&gt;
  [libdefaults]&lt;br /&gt;
    default_realm = EXAMPLE.COM&lt;br /&gt;
    # Depending on what you are testing, you may want something like:&lt;br /&gt;
    # default_keytab_name = FILE:/usr/local/var/keytab&lt;br /&gt;
  [realms]&lt;br /&gt;
    EXAMPLE.COM = {&lt;br /&gt;
      admin_server = 127.0.0.1:50001&lt;br /&gt;
      kdc = 127.0.0.1:50000&lt;br /&gt;
      database_module = DB2&lt;br /&gt;
      kdc_ports = 50000&lt;br /&gt;
      kadmind_port = 50001&lt;br /&gt;
    }&lt;br /&gt;
  [dbmodules]&lt;br /&gt;
    DB2 = {&lt;br /&gt;
      db_library = db2&lt;br /&gt;
    }&lt;br /&gt;
  [logging]&lt;br /&gt;
    # Use any pathnames you want here.&lt;br /&gt;
    kdc = FILE:/usr/local/var/krb5kdc/kdc.log&lt;br /&gt;
    admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log&lt;br /&gt;
  # Depending on what you are testing, you may want:&lt;br /&gt;
  # [domain_realm]&lt;br /&gt;
  #   .your.domain = EXAMPLE.COM&lt;br /&gt;
Set the environment variable KRB5_CONFIG to the pathname of this krb5.conf file.  Set the environment variable KRB5_KDC_PROFILE to /dev/null.&lt;br /&gt;
&lt;br /&gt;
5. Run:&lt;br /&gt;
  kdb5_util create -s&lt;br /&gt;
Enter a master password; it can be something insecure like &amp;quot;master&amp;quot;.  The DB will be created in /usr/local/var/krb5kdc/principal and a few other similarly-named files.  The master key stash will be created in /usr/local/var/krb5kdc/.k5.EXAMPLE.COM.&lt;br /&gt;
&lt;br /&gt;
6. Run:&lt;br /&gt;
  kadmin.local&lt;br /&gt;
  addprinc user&lt;br /&gt;
  quit&lt;br /&gt;
Enter a user password; it can be something insecure like &amp;quot;user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
7. Start the KDC by running:&lt;br /&gt;
  krb5kdc&lt;br /&gt;
Check the log file specified in krb5.conf if the KDC has any trouble starting.  You should be able to &amp;quot;kinit user&amp;quot; at this point.&lt;br /&gt;
&lt;br /&gt;
8. If you need kadmind, add another principle user/admin (using kadmin.local as described above), and create the file /usr/local/var/krb5kdc/kadm5.acl containing:&lt;br /&gt;
  user/admin *&lt;br /&gt;
Then start the kadmind server with:&lt;br /&gt;
  kadmind&lt;br /&gt;
If it has trouble starting, check the log file specified in krb5.conf.&lt;br /&gt;
&lt;br /&gt;
==Services4User testing==&lt;br /&gt;
&lt;br /&gt;
A test for Services4User can be found in tests/gssapi/t_s4u.c. You will need a W2K3 or higher AD domain to test this. Notes follow:&lt;br /&gt;
&lt;br /&gt;
* Create a computer account FOO$ using Active Directory Users &amp;amp; Computers (ADUC)&lt;br /&gt;
* Set the UPN to host/foo.domain (no suffix); this is necessary to be able to send an AS-REQ as this principal, otherwise you would need to use the canonical name (FOO$), which will cause principal comparison errors in gss_accept_sec_context() (note: apparently only W2K8 supports suffix-less UPNs; you should use the domain as a suffix for earlier versions). There is an attribute editor in the W2K8 ADUC that lets you do this, otherwise you will need to use LDP.exe or a generic LDAP client.&lt;br /&gt;
* Add a SPN of host/foo.domain. (Again, you can use ADUC in W2K8, or LDP.exe/generic client.)&lt;br /&gt;
* Configure the computer account to support constrained delegation with protocol transition (Trust this computer for delegation to specified services only / Use any authentication protocol)&lt;br /&gt;
* Add host/foo.domain to the keytab (possibly easiest to do this manually with ktadd)&lt;br /&gt;
&lt;br /&gt;
For S4U2Proxy to work the TGT must be forwardable too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kinit -k -t test.keytab -f 'host/test.win.mit.edu@WIN.MIT.EDU'&lt;br /&gt;
./t_s4u delegtest@WIN.MIT.EDU HOST/winhost.win.mit.edu@WIN.MIT.EDU test.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example delegtest@WIN.MIT.EDU is the principal on whose behalf credentials are acquired using S4U2Self; HOST/winhost.win.mit.edu is the host to which we wish to delegate using S4U2Proxy; and test.keytab contains the long term key for test.win.mit.edu.&lt;br /&gt;
&lt;br /&gt;
To test S4U2Self with the MIT KDC, set the ok_to_auth_as_delegate attribute on the service principal using kadmin.&lt;br /&gt;
&lt;br /&gt;
==GSS-API Naming Extensions testing==&lt;br /&gt;
&lt;br /&gt;
Note: the S4U test also tests the GSS-API naming extensions, but there also is a specific test in tests/gssapi/t_namingexts.c. This tests the following APIs:&lt;br /&gt;
&lt;br /&gt;
* gss_import_name() with composite names&lt;br /&gt;
* gss_inquire_name()&lt;br /&gt;
* gss_get_name_attribute()&lt;br /&gt;
* gss_set_name_attribute()&lt;br /&gt;
* gss_delete_name_attribute()&lt;br /&gt;
* gss_export_name_composite()&lt;br /&gt;
* gss_map_name_to_any&lt;br /&gt;
* gss_release_any_name_mapping&lt;br /&gt;
&lt;br /&gt;
Note: gss_display_name_ext() is not tested because we don't yet have a concrete implementation of it.&lt;br /&gt;
&lt;br /&gt;
The usage of this test is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
t_namingexts [--spnego] [principal] [keytab]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the optional --spnego argument uses the SPNEGO (as opposed to the krb5) mechanism; principal is the service principal to test with, and keytab is a path to the keytab containing the key for the service principal. (The client and service principal are identical in the test. To test with another client principal, use the S4U test.)&lt;br /&gt;
&lt;br /&gt;
You likely want to test this against a Windows KDC, in order to validate PAC introspection; however, you can also test with the greet_client (and greet_server) plugins that are included in plugins/authdata/greet_{client,server}.&lt;br /&gt;
&lt;br /&gt;
==Principal lockout testing==&lt;br /&gt;
&lt;br /&gt;
There are now some automated lockout tests, but these procedures are still helpful for examining some edge cases.&lt;br /&gt;
&lt;br /&gt;
Testing for lockout is identical for the LDAP and DB2 backends, although if you wish to test the replication functionality, you'll need to use a DB2 backend. No changes are required for configuring kprop/iprop; it's business as usual (the only difference being that lockout-related attributes will not be replicated, so as part of testing you should verify on each KDC that this is the case).&lt;br /&gt;
&lt;br /&gt;
First, you need to create a password policy that specifies a lockout policy. Do this with kadmin. Here we create a policy where a maximum failure count of 3, a failure count reset interval of 180 seconds, and a lockout duration of 60 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: addpol -maxfailure 3 -failurecountinterval 180 -lockoutduration 60 lockout_test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you need to associate a principal with the lockout policy. Note also that the pre-authentication required attribute must be set on the principal; principals without this attribute set are not subject to the lockout policy (as they are not required to prove knowledge of their long-term key to the KDC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin:  modprinc -policy lockout_test +requires_preauth lukeh&lt;br /&gt;
Principal &amp;quot;lukeh@MIT.DE.PADL.COM&amp;quot; modified.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, perform a successful authentication with kinit. You should see the last successful authentication timestamp updated in the information returned by kadmin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last successful authentication: Wed Oct 07 14:07:08 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perform an unsuccessful authentication (ie. kinit with an incorrect password) and you should see the failed authentication timestamp and count updated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:07:58 CEST 2009&lt;br /&gt;
Failed password attempts: 1&lt;br /&gt;
Account locked time: [never]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another two authentication failures (recall, the maximum failure count above is 3) and you should see that the principal is locked out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kadmin: getprinc lukeh&lt;br /&gt;
...&lt;br /&gt;
Last failed authentication: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
Failed password attempts: 3&lt;br /&gt;
Account locked time: Wed Oct 07 14:08:37 CEST 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can try to unlock the account explicitly with &amp;lt;i&amp;gt;modprinc -unlock&amp;lt;/i&amp;gt;, or you can wait the lockout duration (here, 60 seconds) and you should be able to authenticate again.&lt;br /&gt;
&lt;br /&gt;
==KDC worker processes==&lt;br /&gt;
&lt;br /&gt;
There is a very basic automated test of parallel KDC worker processes, but it doesn't ensure that all worker processes can receive packets.  To test that, make the following temporary code modifications:&lt;br /&gt;
&lt;br /&gt;
* In plugins/kdb/db2/kdb_db2.c:krb5_db2_get_principal(), add this code near the beginning:&lt;br /&gt;
&lt;br /&gt;
    if (searchfor-&amp;gt;length &amp;gt;= 1 &amp;amp;&amp;amp;&lt;br /&gt;
        data_eq_string(searchfor-&amp;gt;data[0], &amp;quot;slowuser&amp;quot;))&lt;br /&gt;
        sleep(60);&lt;br /&gt;
&lt;br /&gt;
* In lib/krb5/os/sendto_kdc.c, change MAX_PASS from 3 to 1, and in krb5_sendto_kdc() change all assignments of socktype2 to 0.  This ensures that kinit will only send one request.&lt;br /&gt;
&lt;br /&gt;
* In util/k5test.py, change the default arguments for the start_kdc() realm method like so:&lt;br /&gt;
&lt;br /&gt;
    def start_kdc(self, args=['-w', '3']):&lt;br /&gt;
&lt;br /&gt;
Build the sources and run &amp;quot;make testrealm&amp;quot;.  You should be able to run &amp;quot;kinit slowuser&amp;quot; three times before the KDC becomes unresponsive to &amp;quot;kinit user&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==SAM-2 preauth client code==&lt;br /&gt;
&lt;br /&gt;
The securid_sam2 preauth module isn't built by default and ordinarily only compiles successfully in the presence of the RSA ACE library.  But it can be built with alternate flags to use a test method which can help exercise the client SAM-2 preauth code in send-encrypted-sad mode.&lt;br /&gt;
&lt;br /&gt;
* First, build the securid_sam2 module with the test method instead of the securid method:&lt;br /&gt;
&lt;br /&gt;
    cd plugins/preauth/securid_sam2&lt;br /&gt;
    make DEFINES='-DGRAIL_PREAUTH' ACELIB=&lt;br /&gt;
    cd ../../..&lt;br /&gt;
&lt;br /&gt;
* Start with a basic test realm:&lt;br /&gt;
&lt;br /&gt;
    make testrealm&lt;br /&gt;
&lt;br /&gt;
* Edit datadir/krb5.master.conf and add the following to register the module.  Make sure to specify the correct absolute path to the module shared object, which will depend on where your build directory is located.&lt;br /&gt;
&lt;br /&gt;
    [plugins]&lt;br /&gt;
        kdcpreauth = {&lt;br /&gt;
            module = securid_sam2:/path/to/plugins/preauth/securid_sam2/securid_sam2.so&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
* Do the following in kadmin.local:&lt;br /&gt;
&lt;br /&gt;
    addprinc -randkey user/GRAIL&lt;br /&gt;
    modprinc +requires_hwauth user&lt;br /&gt;
&lt;br /&gt;
* Restart the KDC (find the pid of the running krb5kdc process, kill it, and then run &amp;quot;krb5kdc&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* Run &amp;quot;kinit user&amp;quot;.  If you enter the correct password for user and correctly echo the challenge, you should get tickets.  If you enter either one wrong, you should get an error.&lt;br /&gt;
&lt;br /&gt;
* Remember to kill your krb5kdc process after exiting the test realm; the test realm code won't clean up the one you started by hand.&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Developer_resources&amp;diff=4709</id>
		<title>Developer resources</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Developer_resources&amp;diff=4709"/>
				<updated>2012-06-27T15:52:07Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Don't link to the old texinfo documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists resources that [[developers]] use on a regular basis.  One goal of the page is to help those beginning to track the project know what they may be interested in looking at.&lt;br /&gt;
==Documentation==&lt;br /&gt;
&lt;br /&gt;
* [http://web.mit.edu/kerberos/krb5-current/doc/krb_build/index.html Building Kerberos V5] describes how to build and install MIT Kerberos.&lt;br /&gt;
* The [http://web.mit.edu/kerberos/krb5-current/doc/ documentation site] contains administrator and user documentation, and some information for developers; this documentation can help in understanding the product.&lt;br /&gt;
* The [[Glossary]] is a quick index of acronyms and terms related to Kerberos, which you may come across while reading the code.&lt;br /&gt;
* [[Plugin development]] notes, pointers, tips, etc (needed!)&lt;br /&gt;
&lt;br /&gt;
==Mailing lists==&lt;br /&gt;
&lt;br /&gt;
Much of the discussion of new proposals, discussion of what direction to take the product and answering of questions takes place on mailing lists.&lt;br /&gt;
&lt;br /&gt;
* [http://mailman.mit.edu/mailman/listinfo/krbdev krbdev@mit.edu] is the primary list for developers of [[MIT Kerberos]].&lt;br /&gt;
* [http://mailman.mit.edu/mailman/listinfo/kfwdev kfwdev@mit.edu] serves a similar purpose for [[Kerberos for Windows]].&lt;br /&gt;
* [http://mailman.mit.edu/mailman/listinfo/cvs-krb5 cvs-krb5@mit.edu] receives all krb5 commit messages and allows developers to track all changes made to MIT Kerberos.&lt;br /&gt;
* [http://mailman.mit.edu/mailman/listinfo/krb5-appl-commits krb5-appl-commits@mit.edu] receives all krb5-appl commit messages and allows developers to track all changes made to the MIT Kerberos applications.&lt;br /&gt;
* [http://mailman.mit.edu/mailman/listinfo/krb5-bugs krb5-bugs@mit.edu] is notified when a [[ticket]] is created or updated.  This list helps track bugs and feature requests.&lt;br /&gt;
* krbcore@mit.edu is a private list for [[Krbcore]]; send mail to this list if you need to contact the core team.&lt;br /&gt;
* krbcore-security@mit.edu is the point of contact for security problems with MIT Kerberos.&lt;br /&gt;
&lt;br /&gt;
==Source code==&lt;br /&gt;
&lt;br /&gt;
* [[Getting source code]]&lt;br /&gt;
&lt;br /&gt;
==Bug tracking==&lt;br /&gt;
&lt;br /&gt;
* http://krbdev.mit.edu/rt/ is the interface to the bug tracking server.&lt;br /&gt;
* Log in with user name guest and password guest.  (or use the guest login button)&lt;br /&gt;
* See {{trunkref|doc/procedures.txt}} for some information on bug states.&lt;br /&gt;
&lt;br /&gt;
== Instant messaging ==&lt;br /&gt;
&lt;br /&gt;
[[Developer chat]]&lt;br /&gt;
&lt;br /&gt;
== Lore ==&lt;br /&gt;
&lt;br /&gt;
You may find relevant accumulated lore in [[:Category:Lore]].&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Getting_source_code&amp;diff=4708</id>
		<title>Getting source code</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Getting_source_code&amp;diff=4708"/>
				<updated>2012-06-27T14:44:40Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: link to building and test suite where we talk about the git repo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MIT Kerberos source code is in a Git repository.&lt;br /&gt;
&lt;br /&gt;
== Official releases ==&lt;br /&gt;
&lt;br /&gt;
Typically, end users and system administrators who want the latest stable MIT krb5 software should use the official releases:&lt;br /&gt;
&lt;br /&gt;
* [http://web.mit.edu/kerberos/dist/ MIT Keberos download page]&lt;br /&gt;
&lt;br /&gt;
== Git repository access ==&lt;br /&gt;
&lt;br /&gt;
The current development source code is now in a Git repository. The latest development code is on the &amp;quot;master&amp;quot; branch, as is usual for Git. (It used to be &amp;quot;trunk&amp;quot; when the main repository was in Subversion.) Developers wishing to contribute changes to the krb5 software should track this repository. Advanced end users and system administrators may also wish to obtain the latest development sources from this repository.&lt;br /&gt;
&lt;br /&gt;
The krb5 repository migrated to Git during the weekend of 2012-05-11. Use the following URLs for read-only access.&lt;br /&gt;
&lt;br /&gt;
* git://github.com/krb5/krb5.git for the public read-only Git access&lt;br /&gt;
* https://github.com/krb5/krb5 for browsing&lt;br /&gt;
&lt;br /&gt;
If you are interested in contributing changes to our repository, please consult our [[Coding style/Version control practices | version control practices]] page. You should of course test changes before submitting them for inclusion; see [[Building]] for the additional steps needed to build from a git checkout and [[Test suite]] for more information about the regression tests. Additional information about the [[Git migration]] is available, including help for situations where you have an existing GitHub fork of the krb5-anonsvn Git repository.&lt;br /&gt;
&lt;br /&gt;
There is a wiki page with details about the [[Git conversion]] process available for people who are interested in the technical details.&lt;br /&gt;
&lt;br /&gt;
== Repository browsing ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/krb5/krb5 for browsing on GitHub&lt;br /&gt;
&lt;br /&gt;
The following browsing options currently point to a frozen Subversion snapshot, but may convert to tracking the Git repository in the future.&lt;br /&gt;
&lt;br /&gt;
* [http://src.mit.edu/fisheye/browse/krb5 FishEye] provides a feature-rich view of the repository&lt;br /&gt;
* [http://src.mit.edu/opengrok/ OpenGrok] provides an interface that allows you to search for the definition or usage of a specific function; it is somewhat better for cross references than FishEye.&lt;br /&gt;
&lt;br /&gt;
== Subversion repository (historical) ==&lt;br /&gt;
&lt;br /&gt;
The Subversion repository is now frozen, and remains accessible for specialized reference purposes (e.g., inspecting history that the Git conversion intentionally omitted).&lt;br /&gt;
&lt;br /&gt;
=== Subversion repository access ===&lt;br /&gt;
&lt;br /&gt;
* svn://anonsvn.mit.edu/krb5 provides read-only Subversion access to the repository.&lt;br /&gt;
* http://anonsvn.mit.edu/viewvc/krb5 provides a basic form of web access to the entire repository.&lt;br /&gt;
&amp;lt;!-- was /svn/krb5; pending ops installation of backwards compat link--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Git-svn mirror ===&lt;br /&gt;
&lt;br /&gt;
The Git-svn mirror described below is a static snapshot, since the main repository has migrated to Git.&lt;br /&gt;
&lt;br /&gt;
Additional information is available about [[using git-svn (historical)]].&lt;br /&gt;
* git://krbdev.mit.edu/git/krb5-anonsvn.git is a git-svn mirror of the anonsvn repository.&lt;br /&gt;
* https://github.com/krb5/krb5-anonsvn is a Github repository that mirrors the krb5-anonsvn repository. The web interface allows for repository browsing, and also displays URLs for git access using both native git protocol and HTTPS (for firewall traversal, etc.).&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Committer_resources&amp;diff=4704</id>
		<title>Committer resources</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Committer_resources&amp;diff=4704"/>
				<updated>2012-06-26T20:59:49Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Undo revision 4702 by BenKaduk (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is information for developers who are newly receiving commit access.&lt;br /&gt;
&lt;br /&gt;
== Enrollment ==&lt;br /&gt;
&lt;br /&gt;
* Athena account: MITKC staff will sponsor as appropriate.  See http://web.mit.edu/accounts/www/getaccount.html for some overview information about Athena accounts.&lt;br /&gt;
* X.509 client certificate: Needed for RT access, among others.  Information on how to obtain one is at http://web.mit.edu/ist/topics/certificates/index.html&lt;br /&gt;
* RT account&lt;br /&gt;
* Git access&lt;br /&gt;
* Daptiv access (for some contributors working on time-sensitive projects)&lt;br /&gt;
* Posting authorization to cvs-krb5 if you are going to commit stuff.&lt;br /&gt;
&lt;br /&gt;
== Where stuff is at ==&lt;br /&gt;
&lt;br /&gt;
* Git URL git.mit.edu:/git/krb5.git -- you may need to put &amp;quot;username@&amp;quot; in front of the hostname if your local username is not the same as your Athena account name.  Kerberos-authenticated SSH is best, if you can get it to work.&lt;br /&gt;
* SSH to athena.dialup.mit.edu if you want easy access to AFS, a UNIX shell, etc.&lt;br /&gt;
* RT https://krbdev.mit.edu/rt/ (or https://krbdev.mit.edu:444/rt/ if your browser doesn't deal with &amp;quot;optional&amp;quot; SSL client certificate verification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Lore]]&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Committer_resources&amp;diff=4702</id>
		<title>Committer resources</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Committer_resources&amp;diff=4702"/>
				<updated>2012-06-26T15:36:28Z</updated>
		
		<summary type="html">&lt;p&gt;BenKaduk: Make the git repo URL one that actually works&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is information for developers who are newly receiving commit access.&lt;br /&gt;
&lt;br /&gt;
== Enrollment ==&lt;br /&gt;
&lt;br /&gt;
* Athena account: MITKC staff will sponsor as appropriate.  See http://web.mit.edu/accounts/www/getaccount.html for some overview information about Athena accounts.&lt;br /&gt;
* X.509 client certificate: Needed for RT access, among others.  Information on how to obtain one is at http://web.mit.edu/ist/topics/certificates/index.html&lt;br /&gt;
* RT account&lt;br /&gt;
* Git access&lt;br /&gt;
* Daptiv access (for some contributors working on time-sensitive projects)&lt;br /&gt;
* Posting authorization to cvs-krb5 if you are going to commit stuff.&lt;br /&gt;
&lt;br /&gt;
== Where stuff is at ==&lt;br /&gt;
&lt;br /&gt;
* Git URL git+ssh://git.mit.edu/git/krb5.git -- you may need to create a ssh configuration entry (~/.ssh/config) for Host git.mit.edu with a User directive if your local username is not the same as your Athena account name.  Kerberos-authenticated SSH is best, if you can get it to work.&lt;br /&gt;
* SSH to athena.dialup.mit.edu if you want easy access to AFS, a UNIX shell, etc.&lt;br /&gt;
* RT https://krbdev.mit.edu/rt/ (or https://krbdev.mit.edu:444/rt/ if your browser doesn't deal with &amp;quot;optional&amp;quot; SSL client certificate verification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Lore]]&lt;/div&gt;</summary>
		<author><name>BenKaduk</name></author>	</entry>

	</feed>