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

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Coding_style&amp;diff=2728</id>
		<title>Coding style</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Coding_style&amp;diff=2728"/>
				<updated>2009-09-22T22:51:08Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* General information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
The C language '''Coding style''' described here is based on the BSD coding style (Kernel Normal Form - KNF), with some additional elements from the GNU coding standards and the SunOS coding standards.&lt;br /&gt;
&lt;br /&gt;
* [[Coding style/Formatting|Formatting]]&lt;br /&gt;
* [[Coding style/Practices|Practices]]&lt;br /&gt;
* [[Coding style/Transition_strategies|Transition strategies]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style?rev=HEAD NetBSD &amp;lt;code&amp;gt;/usr/share/misc/style&amp;lt;/code&amp;gt;] [http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style (log)]&lt;br /&gt;
* [http://www.gnu.org/prep/standards/ GNU coding standards]&lt;br /&gt;
* [http://opensolaris.org/os/community/on/cstyle.ms.pdf C Style and Coding Standards for SunOS]&lt;br /&gt;
&lt;br /&gt;
== General information ==&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in GNU coding std but not here ===&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force extra indent of operators of different precedences&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force general extra indent of expressions that are broken between lines&lt;br /&gt;
&lt;br /&gt;
* use of ^L characters to break up source files into pages&lt;br /&gt;
&lt;br /&gt;
* nitpicking about capitalization in comments of variable names when their values are meant&lt;br /&gt;
&lt;br /&gt;
* commenting usages of static variables&lt;br /&gt;
&lt;br /&gt;
* casts to void&lt;br /&gt;
&lt;br /&gt;
* separation of word in names with underscores vs case change&lt;br /&gt;
&lt;br /&gt;
* enum vs #define'd integer constants &lt;br /&gt;
&lt;br /&gt;
* 14 char filename limits, MS-DOS filename limits&lt;br /&gt;
&lt;br /&gt;
* portability&lt;br /&gt;
&lt;br /&gt;
* system library function quirks&lt;br /&gt;
&lt;br /&gt;
* internationalization&lt;br /&gt;
&lt;br /&gt;
* mmap()&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in BSD KNF but not here ===&lt;br /&gt;
&lt;br /&gt;
* sorting of header files&lt;br /&gt;
&lt;br /&gt;
* sorting of struct members&lt;br /&gt;
&lt;br /&gt;
* separating struct tag decl and struct typedef&lt;br /&gt;
&lt;br /&gt;
* sorting of var decl&lt;br /&gt;
&lt;br /&gt;
* lining up var names in decls&lt;br /&gt;
&lt;br /&gt;
* newline after decls&lt;br /&gt;
&lt;br /&gt;
* usage of __P&lt;br /&gt;
&lt;br /&gt;
* usage of getopt&lt;br /&gt;
&lt;br /&gt;
* not initializing vars in decls&lt;br /&gt;
&lt;br /&gt;
* stdarg/varargs handling&lt;br /&gt;
&lt;br /&gt;
=== Emacs cc-mode style ===&lt;br /&gt;
&lt;br /&gt;
Putting the following code in your .emacs file will result in mostly&lt;br /&gt;
the right thing happening with respect to formatting style.  Note that&lt;br /&gt;
you may want to turn on auto-newline feature of cc-mode, though that&lt;br /&gt;
seems to have some bugs with brace-elseif-brace handling at least in&lt;br /&gt;
the version of cc-mode that comes with emacs 20.3.&lt;br /&gt;
&lt;br /&gt;
        (defconst krb5-c-style&lt;br /&gt;
          '(&amp;quot;bsd&amp;quot; &lt;br /&gt;
            (c-cleanup-list&lt;br /&gt;
             brace-elseif-brace brace-else-brace defun-close-semi)&lt;br /&gt;
            (c-comment-continuation-stars . &amp;quot;* &amp;quot;)&lt;br /&gt;
            (c-electric-pound-behavior alignleft)&lt;br /&gt;
            (c-hanging-braces-alist&lt;br /&gt;
             (brace-list-open)&lt;br /&gt;
             (class-open after)&lt;br /&gt;
             (substatement-open after)&lt;br /&gt;
             (block-close . c-snug-do-while)&lt;br /&gt;
             (extern-lang-open after))&lt;br /&gt;
            (c-hanging-colons-alist&lt;br /&gt;
             (case-label after)&lt;br /&gt;
             (label after))&lt;br /&gt;
            (c-hanging-comment-starter-p)&lt;br /&gt;
            (c-hanging-comment-ender-p)&lt;br /&gt;
            (c-indent-comments-syntactically-p . t)&lt;br /&gt;
            (c-label-minimum-indentation . 0)&lt;br /&gt;
            (c-special-indent-hook)))&lt;br /&gt;
        (defun krb5-c-hook ()&lt;br /&gt;
          (c-add-style &amp;quot;krb5&amp;quot; krb5-c-style t))&lt;br /&gt;
        (add-hook 'c-mode-common-hook 'krb5-c-hook)&lt;br /&gt;
&lt;br /&gt;
You might also want to try (for Emacs 22 and later):&lt;br /&gt;
&lt;br /&gt;
        (add-hook 'before-save-hook 'copyright-update)&lt;br /&gt;
&lt;br /&gt;
which will offer to update the year in the top-most copyright notice in a file when you save it, if it's not already current.&lt;br /&gt;
&lt;br /&gt;
=== indent.pro settings ===&lt;br /&gt;
&lt;br /&gt;
The following settings for the indent program should produce a&lt;br /&gt;
reasonable approximation to the C coding style described here, though&lt;br /&gt;
some manual cleanup may be necessary.  Note that the gindent installed&lt;br /&gt;
in the gnu locker does not currently handle -nut or -psl correctly though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bap&lt;br /&gt;
-br&lt;br /&gt;
-ce&lt;br /&gt;
-ci4&lt;br /&gt;
-cli0&lt;br /&gt;
-d0&lt;br /&gt;
-di8&lt;br /&gt;
-i4&lt;br /&gt;
-ip4&lt;br /&gt;
-l79&lt;br /&gt;
-nbc&lt;br /&gt;
-ncdb&lt;br /&gt;
-ndj&lt;br /&gt;
-nfc1&lt;br /&gt;
-lp&lt;br /&gt;
-npcs&lt;br /&gt;
-nut&lt;br /&gt;
-psl&lt;br /&gt;
-sc&lt;br /&gt;
-sob&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== vim/gvim editor settings ===&lt;br /&gt;
These settings allow the vim/gvim editor to conform to the MITKC code style:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set shiftwidth=4&lt;br /&gt;
set tabstop=8&lt;br /&gt;
set softtabstop=4&lt;br /&gt;
set expandtab&lt;br /&gt;
set nosmartindent&lt;br /&gt;
set cindent &lt;br /&gt;
set cinoptions=p0,t0,+4,(0,u4,U1,:0&lt;br /&gt;
set formatoptions=croq&lt;br /&gt;
set comments=sr:/*,mb:*,ex:*/,://&lt;br /&gt;
set textwidth=79&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=1297</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=1297"/>
				<updated>2009-06-29T22:11:06Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-completed}}&lt;br /&gt;
&lt;br /&gt;
==Desired changes==&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
==Functional Requirements==&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
==Design of implementation==&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* A new TL-data type, KRB5_TL_ACTKVNO, would apply to all principals and will be a set of {actkvno, start_time} tuples where actkvno is the &amp;quot;active&amp;quot; KVNO and start_time indicates when actkvno is valid for use.&lt;br /&gt;
** When set for the K/M principal this indicates the master key to be used when encrypting principal's long term keys.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** When set for service principals this indicates the key to be used when the KDC issues service tickets.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new master key to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; [startdate] : Set the current mkey KVNO.  This controls which master key is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all master keys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.  (NOTE: During implementation, this was changed to just use the preexisting &amp;quot;stash&amp;quot; command when a stash file is already present.)&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originally encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
==Tasks/milestones==&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~6 weeks&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
==Desired integration and release goals==&lt;br /&gt;
&lt;br /&gt;
==Testing plan==&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.  Unit tests will include testing that the various of setting a&lt;br /&gt;
new key (kpasswd, kadmin commands like cpw or ktadd, as well as the&lt;br /&gt;
new/modified commands) when applied to the master key principal will&lt;br /&gt;
either be rejected without changing the database or retain all the old&lt;br /&gt;
keys, even if that list is larger than the normal key history size in&lt;br /&gt;
order to make sure the normal key history mechanisms won't accidentally&lt;br /&gt;
throw away any still-used master keys.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 1 (0 is not a valid value).&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
#[[User:TomYu|TomYu]]&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Reporting_bugs&amp;diff=1222</id>
		<title>Talk:Reporting bugs</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Reporting_bugs&amp;diff=1222"/>
				<updated>2009-04-23T19:14:31Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New page: Are security vulnerability bug also supposed to be reported this way?  If not, this page should explain how to report those sorts of bugs.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Are security vulnerability bug also supposed to be reported this way?  If not, this page should explain how to report those sorts of bugs.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=777</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=777"/>
				<updated>2008-10-21T18:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Testing plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-approved}}&lt;br /&gt;
&lt;br /&gt;
==Desired changes==&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
==Functional Requirements==&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
==Design of implementation==&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* A new TL-data type, KRB5_TL_ACTKVNO, would apply to all principals and will be a set of {actkvno, start_time} tuples where actkvno is the &amp;quot;active&amp;quot; KVNO and start_time indicates when actkvno is valid for use.&lt;br /&gt;
** When set for the K/M principal this indicates the master key to be used when encrypting principal's long term keys.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** When set for service principals this indicates the key to be used when the KDC issues service tickets.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new master key to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; [startdate] : Set the current mkey KVNO.  This controls which master key is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
==Tasks/milestones==&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~6 weeks&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
==Desired integration and release goals==&lt;br /&gt;
&lt;br /&gt;
==Testing plan==&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.  Unit tests will include testing that the various of setting a&lt;br /&gt;
new key (kpasswd, kadmin commands like cpw or ktadd, as well as the&lt;br /&gt;
new/modified commands) when applied to the master key principal will&lt;br /&gt;
either be rejected without changing the database or retain all the old&lt;br /&gt;
keys, even if that list is larger than the normal key history size in&lt;br /&gt;
order to make sure the normal key history mechanisms won't accidentally&lt;br /&gt;
throw away any still-used master keys.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 1 (0 is not a valid value).&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
#[[User:TomYu|TomYu]]&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=640</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=640"/>
				<updated>2008-10-01T20:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Tasks/milestones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-09-16}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* A new TL-data type, KRB5_TL_ACTKVNO, would apply to all principals and will be a set of {actkvno, start_time} tuples where actkvno is the &amp;quot;active&amp;quot; KVNO and start_time indicates when actkvno is valid for use.&lt;br /&gt;
** When set for the K/M principal this indicates the master key to be used when encrypting principal's long term keys.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** When set for service principals this indicates the key to be used when the KDC issues service tickets.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new master key to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; [startdate] : Set the current mkey KVNO.  This controls which master key is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~6 weeks&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 0.&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=625</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=625"/>
				<updated>2008-09-30T23:29:59Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Design of implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-09-16}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* A new TL-data type, KRB5_TL_ACTKVNO, would apply to all principals and will be a set of {actkvno, start_time} tuples where actkvno is the &amp;quot;active&amp;quot; KVNO and start_time indicates when actkvno is valid for use.&lt;br /&gt;
** When set for the K/M principal this indicates the master key to be used when encrypting principal's long term keys.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** When set for service principals this indicates the key to be used when the KDC issues service tickets.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new master key to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; [startdate] : Set the current mkey KVNO.  This controls which master key is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~8 week&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 0.&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=500</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=500"/>
				<updated>2008-09-12T00:21:16Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Design of implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-09-16}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M, and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** The current master key version number that should be used when changing database entries.  This may not be the latest key and is set by the administrator.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new mkey to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; : Set the current mkey KVNO.  This controls which mkey is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~8 week&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 0.&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=495</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=495"/>
				<updated>2008-09-03T00:16:50Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-09-16}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M, and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** The current master key version number that should be used when changing database entries.  This may not be the latest key and is set by the administrator.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new mkey to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; : Set the current mkey KVNO.  This controls which mkey is used when encrypting principal keys.  The kadmind should be stopped/disabled prior to running this command and enabled after successful completion.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~8 week&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 0.&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=494</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=494"/>
				<updated>2008-09-03T00:10:54Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New page: {{project-early}}  =Desired changes=  This project will provide the ability to add a new master key (with an enctype differing from the current master key) to the master key principal and ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M, and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** The current master key version number that should be used when changing database entries.  This may not be the latest key and is set by the administrator.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new mkey to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; : Set the current mkey KVNO.  This controls which mkey is used when encrypting principal keys.  The kadmind should be stopped/disabled prior to running this command and enabled after successful completion.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all masterkeys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originaly encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~8 week&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 0.&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=386</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=386"/>
				<updated>2008-05-08T21:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-approved|2008-04-18}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab and also retrieve a master key&lt;br /&gt;
based on a given KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.  These utilities will also be able to read and old format stash file.&lt;br /&gt;
They will not be able to write an old format stash file.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.  Also note that&lt;br /&gt;
krb5_db_def_fetch_mkey() will be passing the K/M@&amp;lt;realm&amp;gt; master key&lt;br /&gt;
principal as an arg to krb5_kt_get_entry() which will return an error if&lt;br /&gt;
there are no entries for that principal in the keytab.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;br /&gt;
&lt;br /&gt;
An old copy of a binary stash file will be checked in to the source&lt;br /&gt;
tree to aid in regression testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard ''talk page''conventions.    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
:[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I've noted approval  but I'd like to ask you to consider a couple of issues:&lt;br /&gt;
* It would be good if an old format stash file was checked into the  source tree and the regression tests run with make check confirm we can read that stash file.&lt;br /&gt;
* Please clearly document what happens when kt_get_entry doesn't find the right principal but does parse the file as a keytab?&lt;br /&gt;
:--[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=383</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=383"/>
				<updated>2008-05-07T23:35:48Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Design of implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-04-18}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab and also retrieve a master key&lt;br /&gt;
based on a given KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.  These utilities will also be able to read and old format stash file.&lt;br /&gt;
They will not be able to write an old format stash file.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.  Also note that&lt;br /&gt;
krb5_db_def_fetch_mkey() will be passing the K/M@&amp;lt;realm&amp;gt; master key&lt;br /&gt;
principal as an arg to krb5_kt_get_entry() which will return an error if&lt;br /&gt;
there are no entries for that principal in the keytab.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;br /&gt;
&lt;br /&gt;
An old copy of a binary stash file will be checked in to the source&lt;br /&gt;
tree to aid in regression testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard ''talk page''conventions.    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
:[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I've noted approval  but I'd like to ask you to consider a couple of issues:&lt;br /&gt;
* It would be good if an old format stash file was checked into the  source tree and the regression tests run with make check confirm we can read that stash file.&lt;br /&gt;
* Please clearly document what happens when kt_get_entry doesn't find the right principal but does parse the file as a keytab?&lt;br /&gt;
:--[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=382</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=382"/>
				<updated>2008-05-07T22:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Testing plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-04-18}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab and also retrieve a master key&lt;br /&gt;
based on a given KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.  These utilities will also be able to read and old format stash file.&lt;br /&gt;
They will not be able to write an old format stash file.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;br /&gt;
&lt;br /&gt;
An old copy of a binary stash file will be checked in to the source&lt;br /&gt;
tree to aid in regression testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard ''talk page''conventions.    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
:[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I've noted approval  but I'd like to ask you to consider a couple of issues:&lt;br /&gt;
* It would be good if an old format stash file was checked into the  source tree and the regression tests run with make check confirm we can read that stash file.&lt;br /&gt;
* Please clearly document what happens when kt_get_entry doesn't find the right principal but does parse the file as a keytab?&lt;br /&gt;
:--[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=349</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=349"/>
				<updated>2008-04-18T16:58:58Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Functional Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-04-18}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab and also retrieve a master key&lt;br /&gt;
based on a given KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.  These utilities will also be able to read and old format stash file.&lt;br /&gt;
They will not be able to write an old format stash file.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard ''talk page''conventions.    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
:[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I've noted approval  but I'd like to ask you to consider a couple of issues:&lt;br /&gt;
* It would be good if an old format stash file was checked into the  source tree and the regression tests run with make check confirm we can read that stash file.&lt;br /&gt;
* Please clearly document what happens when kt_get_entry doesn't find the right principal but does parse the file as a keytab?&lt;br /&gt;
:--[[User:SamHartman|SamHartman]] 12:20, 4 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=320</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=320"/>
				<updated>2008-04-10T21:23:04Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Proposing a project Issue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;br /&gt;
: There is not a formalized code review policy.  Certainly requesting specific code review as part of the community review of a project would be fine. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Submitting a project for review needs work ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Submitting a project for review&amp;quot; section indicates the submitter&lt;br /&gt;
should:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To start the review period :&lt;br /&gt;
&lt;br /&gt;
   1. Replace {{project-early}} with {{project-review|end_of_review_date}}&lt;br /&gt;
   2. Add {{subst:project-vote}} at the bottom of the project page.&lt;br /&gt;
   3. Send mail to krbdev@mit.edu including:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But after saving the project page after following steps 1 &amp;amp; 2, this text &lt;br /&gt;
appears on the project page:&lt;br /&gt;
&lt;br /&gt;
    An announcement has been sent to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
&lt;br /&gt;
This is confusing as it sounds like step 3 was done automatically by the&lt;br /&gt;
wiki.  If the wiki is sending out notification automatically (and I&lt;br /&gt;
think it should) then step 3 should be removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:The Wiki cannot send out mail.  The procedure is correct, but the text on the project page assumes that you actually follow  the directions and send the mail. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
::I think the wording of the project-review template needs to be changed to avoid the ambiguity.  Something like:&lt;br /&gt;
&lt;br /&gt;
    The project owner should have sent an announcement to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
:: --[[User:Wfiveash|Will Fiveash]] 12:42, 4 April 2008 (CDT)&lt;br /&gt;
:::I think updating the policy to make it clear that you need to send the mail but that the page will say that mail is sent would be good.  I think that updating the template will be more confusing than desirable.  I'll also update the template docs. --[[User:SamHartman|SamHartman]] 13:51, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== let no one else's work evade your eyes...  ==&lt;br /&gt;
&lt;br /&gt;
This is mostly about meta-issues, like how to find project policies for other opensource projects (with links to same) than it is about the content of the policies themselves(''project'' as in ''opensource entity'', like MySQL, not as in a development project for said entity. This is what you get when you hire a tech writer.)&lt;br /&gt;
&lt;br /&gt;
How we make this information available implies how easy it is to contribute to an existing project  vs. how easy it is to propose a project (and affect the general road map). Some opensource projects hide this information from the general public, restricting it to members. &lt;br /&gt;
&lt;br /&gt;
Come to that, I don't see any obvious information about how to become a &amp;quot;member&amp;quot; on our wiki-- i.e.,set up an account with wiki-editing privileges for the Kerberos wiki. I think all you get is an error message that you have to log in to edit a page (is it the same for talk?). There's nothing at all on the [http://web.mit.edu/kerberos/ public web site] about membership/contribution, nor is there any mention or link to the public wiki. Do we want to control access to information about this level of development? I think this is inherently part of the policy -- who can even find this information? (I think this topic  should be considered w/r/t the new website design.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Eclipse'''  presents this information on the [http://www.eclipse.org/projects/dev_process/development_process.php Development Process] page. It's pretty structured -- do we want to be this formal? Requests and complaints about policy are entered into the bug log. There's also a link to the version-in-progress, and a link to the diffs between it and the current version. &lt;br /&gt;
&lt;br /&gt;
''The Wiki cannot send out mail. The procedure is correct, but the text on the project page assumes that you actually follow the directions and send the mail. --SamHartman 12:08, 4 April 2008 (EDT) &lt;br /&gt;
&lt;br /&gt;
'''LaTex''' gets around this by offering mailing lists to which anyone can subscribe on their  [http://www.latex-project.org/code.html Development Code] page. I know we have links to our various mailing lists on the [http://web.mit.edu/kerberos/ public web site] but nothing explicit about a mechanism for using a list to send mail for this purpose Maybe it should be part of the policy page in the wiki? Is that an appropriate use for a mailing list? I hesitate to recommend a separate mailing list for such things (we already have so many!).&lt;br /&gt;
&lt;br /&gt;
BTW, LaTex names their website  [http://www.latex-project.org LaTex Project], which implies that it's not  so much a product as an ongoing development process. What we call things affects others' perceptions.&lt;br /&gt;
&lt;br /&gt;
'''MySQL''' has a very slick site with a tab for [http://dev.mysql.com Developer Zone]. FWIW, I don't like the site itself because it looks too corporate, not like a friendly opensource home page. I didn't delve into it, but it looks like their policy requires potential developers to pass a certification test. They also have a very nice [http://forums.mysql.com forum page].&lt;br /&gt;
&lt;br /&gt;
There's also [http://opensourcehowto.org OpenSource HowTo], but it's intended for novices. BTW, I searched on &amp;quot;kerberos&amp;quot; and it only appeared buried in articles about other opensource programs.&lt;br /&gt;
&lt;br /&gt;
Obviously, I could cite examples forever -- so I'll stop now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Estone|Estone]] 14:12, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
:[[Developers]] makes it fairly clear that anyone can contribute.  The login page has a link for creating an account.  I think it fairly likely that anyone who will successfully manage to contribute to the project will be able  to figure that out.  I think this wiki is intended to be fairly public.  I'm reasonably sure this discussion belongs somewhere else--perhaps [[K5wiki:Positioning the wiki]] or some such. --[[User:SamHartman|SamHartman]] 17:04, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Proposing a project Issue ==&lt;br /&gt;
&lt;br /&gt;
In the Proposing a project section there is this list of elements a&lt;br /&gt;
project proposal should have:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
My issue with the above is that having to include a design,&lt;br /&gt;
documentation and test plan in the initial project proposal is too&lt;br /&gt;
burdensome.  I think the initial proposal must include:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A breakdown of tasks or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
&lt;br /&gt;
and the following would be optional in the initial proposal but would&lt;br /&gt;
have to be submitted for further review if the initial proposal was&lt;br /&gt;
accepted:&lt;br /&gt;
&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* Documentation and sample code for any APIs that are proposed&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
So the idea would be that someone could submit a light weight project&lt;br /&gt;
proposal and if that is approved they would follow up with more detail&lt;br /&gt;
which would then be reviewed.&lt;br /&gt;
&lt;br /&gt;
--[[User:Wfiveash|Will Fiveash]] 14:35, 10 April 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
:I think it is fine for people to include less than is required for approval in a project proposal.  However without a design  I don't think the project should be approved; I think a &amp;quot;sounds like a good start; finish this off&amp;quot; response is fine.  I think we may be agreening with each other.  The question may be what  changes do we need to make to the policy to make this more clear. --[[User:SamHartman|SamHartman]] 17:00, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
::I think we agree.  However the wording of this section needs work.  It's not clear to me from the doc what the point of the early stage is.  If this is for the initial discussion of whether a project has a chance of approval then this should be fleshed out more.&lt;br /&gt;
&lt;br /&gt;
::The wording of the project proposal section should make it clear as what sections are absolutely needed for the early stage and what sections are optional at the early stage.  &lt;br /&gt;
&lt;br /&gt;
::--[[User:Wfiveash|Will Fiveash]] 16:19, 10 April 2008 (CDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=319</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=319"/>
				<updated>2008-04-10T21:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: /* Proposing a project Issue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;br /&gt;
: There is not a formalized code review policy.  Certainly requesting specific code review as part of the community review of a project would be fine. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Submitting a project for review needs work ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Submitting a project for review&amp;quot; section indicates the submitter&lt;br /&gt;
should:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To start the review period :&lt;br /&gt;
&lt;br /&gt;
   1. Replace {{project-early}} with {{project-review|end_of_review_date}}&lt;br /&gt;
   2. Add {{subst:project-vote}} at the bottom of the project page.&lt;br /&gt;
   3. Send mail to krbdev@mit.edu including:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But after saving the project page after following steps 1 &amp;amp; 2, this text &lt;br /&gt;
appears on the project page:&lt;br /&gt;
&lt;br /&gt;
    An announcement has been sent to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
&lt;br /&gt;
This is confusing as it sounds like step 3 was done automatically by the&lt;br /&gt;
wiki.  If the wiki is sending out notification automatically (and I&lt;br /&gt;
think it should) then step 3 should be removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:The Wiki cannot send out mail.  The procedure is correct, but the text on the project page assumes that you actually follow  the directions and send the mail. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
::I think the wording of the project-review template needs to be changed to avoid the ambiguity.  Something like:&lt;br /&gt;
&lt;br /&gt;
    The project owner should have sent an announcement to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
:: --[[User:Wfiveash|Will Fiveash]] 12:42, 4 April 2008 (CDT)&lt;br /&gt;
:::I think updating the policy to make it clear that you need to send the mail but that the page will say that mail is sent would be good.  I think that updating the template will be more confusing than desirable.  I'll also update the template docs. --[[User:SamHartman|SamHartman]] 13:51, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== let no one else's work evade your eyes...  ==&lt;br /&gt;
&lt;br /&gt;
This is mostly about meta-issues, like how to find project policies for other opensource projects (with links to same) than it is about the content of the policies themselves(''project'' as in ''opensource entity'', like MySQL, not as in a development project for said entity. This is what you get when you hire a tech writer.)&lt;br /&gt;
&lt;br /&gt;
How we make this information available implies how easy it is to contribute to an existing project  vs. how easy it is to propose a project (and affect the general road map). Some opensource projects hide this information from the general public, restricting it to members. &lt;br /&gt;
&lt;br /&gt;
Come to that, I don't see any obvious information about how to become a &amp;quot;member&amp;quot; on our wiki-- i.e.,set up an account with wiki-editing privileges for the Kerberos wiki. I think all you get is an error message that you have to log in to edit a page (is it the same for talk?). There's nothing at all on the [http://web.mit.edu/kerberos/ public web site] about membership/contribution, nor is there any mention or link to the public wiki. Do we want to control access to information about this level of development? I think this is inherently part of the policy -- who can even find this information? (I think this topic  should be considered w/r/t the new website design.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Eclipse'''  presents this information on the [http://www.eclipse.org/projects/dev_process/development_process.php Development Process] page. It's pretty structured -- do we want to be this formal? Requests and complaints about policy are entered into the bug log. There's also a link to the version-in-progress, and a link to the diffs between it and the current version. &lt;br /&gt;
&lt;br /&gt;
''The Wiki cannot send out mail. The procedure is correct, but the text on the project page assumes that you actually follow the directions and send the mail. --SamHartman 12:08, 4 April 2008 (EDT) &lt;br /&gt;
&lt;br /&gt;
'''LaTex''' gets around this by offering mailing lists to which anyone can subscribe on their  [http://www.latex-project.org/code.html Development Code] page. I know we have links to our various mailing lists on the [http://web.mit.edu/kerberos/ public web site] but nothing explicit about a mechanism for using a list to send mail for this purpose Maybe it should be part of the policy page in the wiki? Is that an appropriate use for a mailing list? I hesitate to recommend a separate mailing list for such things (we already have so many!).&lt;br /&gt;
&lt;br /&gt;
BTW, LaTex names their website  [http://www.latex-project.org LaTex Project], which implies that it's not  so much a product as an ongoing development process. What we call things affects others' perceptions.&lt;br /&gt;
&lt;br /&gt;
'''MySQL''' has a very slick site with a tab for [http://dev.mysql.com Developer Zone]. FWIW, I don't like the site itself because it looks too corporate, not like a friendly opensource home page. I didn't delve into it, but it looks like their policy requires potential developers to pass a certification test. They also have a very nice [http://forums.mysql.com forum page].&lt;br /&gt;
&lt;br /&gt;
There's also [http://opensourcehowto.org OpenSource HowTo], but it's intended for novices. BTW, I searched on &amp;quot;kerberos&amp;quot; and it only appeared buried in articles about other opensource programs.&lt;br /&gt;
&lt;br /&gt;
Obviously, I could cite examples forever -- so I'll stop now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Estone|Estone]] 14:12, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
:[[Developers]] makes it fairly clear that anyone can contribute.  The login page has a link for creating an account.  I think it fairly likely that anyone who will successfully manage to contribute to the project will be able  to figure that out.  I think this wiki is intended to be fairly public.  I'm reasonably sure this discussion belongs somewhere else--perhaps [[K5wiki:Positioning the wiki]] or some such. --[[User:SamHartman|SamHartman]] 17:04, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Proposing a project Issue ==&lt;br /&gt;
&lt;br /&gt;
In the Proposing a project section there is this list of elements a&lt;br /&gt;
project proposal should have:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
My issue with the above is that having to include a design,&lt;br /&gt;
documentation and test plan in the initial project proposal is too&lt;br /&gt;
burdensome.  I think the initial proposal must include:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A breakdown of tasks or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
&lt;br /&gt;
and the following would be optional in the initial proposal but would&lt;br /&gt;
have to be submitted for further review if the initial proposal was&lt;br /&gt;
accepted:&lt;br /&gt;
&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* Documentation and sample code for any APIs that are proposed&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
So the idea would be that someone could submit a light weight project&lt;br /&gt;
proposal and if that is approved they would follow up with more detail&lt;br /&gt;
which would then be reviewed.&lt;br /&gt;
&lt;br /&gt;
--[[User:Wfiveash|Will Fiveash]] 14:35, 10 April 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
:I think it is fine for people to include less than is required for approval in a project proposal.  However without a design  I don't think the project should be approved; I think a &amp;quot;sounds like a good start; finish this off&amp;quot; response is fine.  I think we may be agreening with each other.  The question may be what  changes do we need to make to the policy to make this more clear. --[[User:SamHartman|SamHartman]] 17:00, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
I think we agree.  However the wording of this section needs work.&lt;br /&gt;
It's not clear to me from the doc what the point of the early stage is.&lt;br /&gt;
If this is for the initial discussion of whether a project has a chance&lt;br /&gt;
of approval then this should be fleshed out more.&lt;br /&gt;
&lt;br /&gt;
The wording of the project proposal section should make it clear as what&lt;br /&gt;
sections are absolutely needed for the early stage and what sections are&lt;br /&gt;
optional at the early stage.&lt;br /&gt;
&lt;br /&gt;
--[[User:Wfiveash|Will Fiveash]] 16:19, 10 April 2008 (CDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=314</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=314"/>
				<updated>2008-04-10T19:38:40Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New section: Proposing a project Issue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;br /&gt;
: There is not a formalized code review policy.  Certainly requesting specific code review as part of the community review of a project would be fine. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Submitting a project for review needs work ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Submitting a project for review&amp;quot; section indicates the submitter&lt;br /&gt;
should:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To start the review period :&lt;br /&gt;
&lt;br /&gt;
   1. Replace {{project-early}} with {{project-review|end_of_review_date}}&lt;br /&gt;
   2. Add {{subst:project-vote}} at the bottom of the project page.&lt;br /&gt;
   3. Send mail to krbdev@mit.edu including:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But after saving the project page after following steps 1 &amp;amp; 2, this text &lt;br /&gt;
appears on the project page:&lt;br /&gt;
&lt;br /&gt;
    An announcement has been sent to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
&lt;br /&gt;
This is confusing as it sounds like step 3 was done automatically by the&lt;br /&gt;
wiki.  If the wiki is sending out notification automatically (and I&lt;br /&gt;
think it should) then step 3 should be removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:The Wiki cannot send out mail.  The procedure is correct, but the text on the project page assumes that you actually follow  the directions and send the mail. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
::I think the wording of the project-review template needs to be changed to avoid the ambiguity.  Something like:&lt;br /&gt;
&lt;br /&gt;
    The project owner should have sent an announcement to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
:: --[[User:Wfiveash|Will Fiveash]] 12:42, 4 April 2008 (CDT)&lt;br /&gt;
:::I think updating the policy to make it clear that you need to send the mail but that the page will say that mail is sent would be good.  I think that updating the template will be more confusing than desirable.  I'll also update the template docs. --[[User:SamHartman|SamHartman]] 13:51, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== let no one else's work evade your eyes...  ==&lt;br /&gt;
&lt;br /&gt;
This is mostly about meta-issues, like how to find project policies for other opensource projects (with links to same) than it is about the content of the policies themselves(''project'' as in ''opensource entity'', like MySQL, not as in a development project for said entity. This is what you get when you hire a tech writer.)&lt;br /&gt;
&lt;br /&gt;
How we make this information available implies how easy it is to contribute to an existing project  vs. how easy it is to propose a project (and affect the general road map). Some opensource projects hide this information from the general public, restricting it to members. &lt;br /&gt;
&lt;br /&gt;
Come to that, I don't see any obvious information about how to become a &amp;quot;member&amp;quot; on our wiki-- i.e.,set up an account with wiki-editing privileges for the Kerberos wiki. I think all you get is an error message that you have to log in to edit a page (is it the same for talk?). There's nothing at all on the [http://web.mit.edu/kerberos/ public web site] about membership/contribution, nor is there any mention or link to the public wiki. Do we want to control access to information about this level of development? I think this is inherently part of the policy -- who can even find this information? (I think this topic  should be considered w/r/t the new website design.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Eclipse'''  presents this information on the [http://www.eclipse.org/projects/dev_process/development_process.php Development Process] page. It's pretty structured -- do we want to be this formal? Requests and complaints about policy are entered into the bug log. There's also a link to the version-in-progress, and a link to the diffs between it and the current version. &lt;br /&gt;
&lt;br /&gt;
''The Wiki cannot send out mail. The procedure is correct, but the text on the project page assumes that you actually follow the directions and send the mail. --SamHartman 12:08, 4 April 2008 (EDT) &lt;br /&gt;
&lt;br /&gt;
'''LaTex''' gets around this by offering mailing lists to which anyone can subscribe on their  [http://www.latex-project.org/code.html Development Code] page. I know we have links to our various mailing lists on the [http://web.mit.edu/kerberos/ public web site] but nothing explicit about a mechanism for using a list to send mail for this purpose Maybe it should be part of the policy page in the wiki? Is that an appropriate use for a mailing list? I hesitate to recommend a separate mailing list for such things (we already have so many!).&lt;br /&gt;
&lt;br /&gt;
BTW, LaTex names their website  [http://www.latex-project.org LaTex Project], which implies that it's not  so much a product as an ongoing development process. What we call things affects others' perceptions.&lt;br /&gt;
&lt;br /&gt;
'''MySQL''' has a very slick site with a tab for [http://dev.mysql.com Developer Zone]. FWIW, I don't like the site itself because it looks too corporate, not like a friendly opensource home page. I didn't delve into it, but it looks like their policy requires potential developers to pass a certification test. They also have a very nice [http://forums.mysql.com forum page].&lt;br /&gt;
&lt;br /&gt;
There's also [http://opensourcehowto.org OpenSource HowTo], but it's intended for novices. BTW, I searched on &amp;quot;kerberos&amp;quot; and it only appeared buried in articles about other opensource programs.&lt;br /&gt;
&lt;br /&gt;
Obviously, I could cite examples forever -- so I'll stop now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Estone|Estone]] 14:12, 10 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Proposing a project Issue ==&lt;br /&gt;
&lt;br /&gt;
In the Proposing a project section there is this list of elements a&lt;br /&gt;
project proposal should have:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
My issue with the above is that having to include a design,&lt;br /&gt;
documentation and test plan in the initial project proposal is too&lt;br /&gt;
burdensome.  I think the initial proposal must include:&lt;br /&gt;
&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A breakdown of tasks or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
&lt;br /&gt;
and the following would be optional in the initial proposal but would&lt;br /&gt;
have to be submitted for further review if the initial proposal was&lt;br /&gt;
accepted:&lt;br /&gt;
&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* Documentation and sample code for any APIs that are proposed&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
So the idea would be that someone could submit a light weight project&lt;br /&gt;
proposal and if that is approved they would follow up with more detail&lt;br /&gt;
which would then be reviewed.&lt;br /&gt;
&lt;br /&gt;
--[[User:Wfiveash|Will Fiveash]] 14:35, 10 April 2008 (CDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=299</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=299"/>
				<updated>2008-04-04T17:43:43Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;br /&gt;
: There is not a formalized code review policy.  Certainly requesting specific code review as part of the community review of a project would be fine. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Submitting a project for review needs work ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Submitting a project for review&amp;quot; section indicates the submitter&lt;br /&gt;
should:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To start the review period :&lt;br /&gt;
&lt;br /&gt;
   1. Replace {{project-early}} with {{project-review|end_of_review_date}}&lt;br /&gt;
   2. Add {{subst:project-vote}} at the bottom of the project page.&lt;br /&gt;
   3. Send mail to krbdev@mit.edu including:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But after saving the project page after following steps 1 &amp;amp; 2, this text &lt;br /&gt;
appears on the project page:&lt;br /&gt;
&lt;br /&gt;
    An announcement has been sent to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
&lt;br /&gt;
This is confusing as it sounds like step 3 was done automatically by the&lt;br /&gt;
wiki.  If the wiki is sending out notification automatically (and I&lt;br /&gt;
think it should) then step 3 should be removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:The Wiki cannot send out mail.  The procedure is correct, but the text on the project page assumes that you actually follow  the directions and send the mail. --[[User:SamHartman|SamHartman]] 12:08, 4 April 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
::I think the wording of the project-review template needs to be changed to avoid the ambiguity.  Something like:&lt;br /&gt;
&lt;br /&gt;
    The project owner should have sent an announcement to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
:: --[[User:Wfiveash|Will Fiveash]] 12:42, 4 April 2008 (CDT)&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=298</id>
		<title>Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=298"/>
				<updated>2008-04-04T17:15:37Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{policy}}&lt;br /&gt;
&lt;br /&gt;
The '''Project Policy''' describes  how members of the community propose to make changes in MIT Kerberos.  A project is a proposal to add new functionality or to change existing functionality in MIT Kerberos.  Projects are reviewed by the community before  the required changes can be integrated into MIT Kerberos.  This review provides the community an opportunity to suggest improvements to the project and to confirm that the community believes that  implementing the project would be a good idea.&lt;br /&gt;
&lt;br /&gt;
==When are projects needed?==&lt;br /&gt;
&lt;br /&gt;
Small changes and relatively simple bug fixes do not require a project.   The project process is designed to provide sufficient community review.  If a change is simple enough and uncontroversial enough  then the change can be made without going through this process.  If members of the development community,especially members of [[Krbcore]], wish to review the change then it should go through a project process.  If a change is committed outside of a project and objections are raised, then any member of Krbcore may revert the change until a project is approved.&lt;br /&gt;
&lt;br /&gt;
The following always require  the project process to be invoked:&lt;br /&gt;
# Introduction of any public [[API]]s&lt;br /&gt;
# Changes in an API or the [[ABI]].  Such changes are rarely approved&lt;br /&gt;
# Significant user interface changes such as the introduction of a new dialogue .&lt;br /&gt;
# Introduction of configuration file variables or documented registry keys&lt;br /&gt;
&lt;br /&gt;
==Proposing  a project==&lt;br /&gt;
&lt;br /&gt;
To propose a project, create a new page under [[Projects]].  For example a project to create a new administration protocol might be called &amp;quot;Projects/new administration protocol&amp;quot;. &lt;br /&gt;
At the beginning of that page include the following:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{project-early}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
This will include the [[Template:project-early|early project template]] which indicates that the project is being fleshed out by its supporters and is not yet under consideration for approval.  Note, to create a page enter the page name (&amp;quot;Projects/new administration protocol&amp;quot; for example) in the wiki search box on left and click on the Go button.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The project proposal page should include the following elements:&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
It is expected that screenshots describing any proposed user interface will be included in any project that describes new interfaces.  Discussion of customer study groups that have evaluated the new interface or other information to validate the interface will help support the project.&lt;br /&gt;
&lt;br /&gt;
===Documenting proposed APIs===&lt;br /&gt;
See [[Documenting APIs]] for current recommendations on how to document APIs that are introduced in a project.  Typically, the community will expect sample code to be included describing the use of APIs that are introduced.&lt;br /&gt;
&lt;br /&gt;
==Which release does a project go in==&lt;br /&gt;
&lt;br /&gt;
Unless a project mentions it is targeting a specific release, then the project will be included in the next release [[Release branches|branched]] off the [[trunk]] after the project is checked in.&lt;br /&gt;
&lt;br /&gt;
Typically the goals of a given release are set during a release planning process at the beginning of that release process.  It is unusual to include additional projects in a release   after the planning has concluded.   A project may propose that it be included in a specific release after the goals for that release have been set, although absent a very convincing justification this is likely to result in blocking objections.&lt;br /&gt;
&lt;br /&gt;
If a project is a goal for a given release, it will typically need to include milestones  to judge its progress against the rest of the release.  If the project is being managed by the consortium staff,  then the consortium project tracking process will be used.    For projects not being done by consortium staff, it is typical to establish coordination point milestones.  See [[Meeting release goals]] for information on how these milestones are used once projects are approved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Submitting a project for review==&lt;br /&gt;
&lt;br /&gt;
Except in cases where prompt action is required, projects require a two week review cycle.  Projects require at least one  yes vote from a member of Krbcore  who has not been a primary proponent of the project to be approved and no blocking objections.    Proponents of the project should work  with members of the community to address suggestions that are raised even if these suggestions are not blocking objections.   If discussion of significant issues is ongoing when the review period extends then approval should be delayed until the discussion concludes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To start the review period :&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-early}} with {{project-review|end_of_review_date}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# Add &amp;lt;nowiki&amp;gt;{{subst:project-vote}}&amp;lt;/nowiki&amp;gt; at the bottom of the project page.&lt;br /&gt;
# Send mail  to krbdev@mit.edu including:&lt;br /&gt;
##The URI to the project page&lt;br /&gt;
##The end of the review period&lt;br /&gt;
##Cut and paste the description of the project from the project page into the review.&lt;br /&gt;
&lt;br /&gt;
==That's a good start==&lt;br /&gt;
&lt;br /&gt;
Often the result of a review will be that what is written so far is good enough that the community wants to explore the project, but checkpoints or '''review gates''' are required.  Examples of such gates include things like  requesting review of design of a particular part of the system, requesting review of APIs that are designed in the future, or interactions with  some part of the system.  Particularly when some of the recommended information is not included in the original project proposal, a review gate may be requested.  When the information to be reviewed is available, another project review should be conducted.  There are no specific details on how to  document this review other than that the &amp;lt;nowiki&amp;gt;{{project-review}}&amp;lt;/nowiki&amp;gt; template should be used so that the project is categorized as under review.&lt;br /&gt;
&lt;br /&gt;
== Project life cycle changes==&lt;br /&gt;
&lt;br /&gt;
===Approving a project===&lt;br /&gt;
&lt;br /&gt;
If the project review concludes successfully  then:&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-review}} with {{project-approved}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Add a ''Current status'' section at the bottom of the project page to track updates&lt;br /&gt;
# Send mail to krbdev@mit.edu noting that the project is approved.&lt;br /&gt;
# If the project is targeted for a specific release add &amp;lt;nowiki&amp;gt;{{project-target|release_name}}&amp;lt;/nowiki&amp;gt; below the project-approved target.&lt;br /&gt;
&lt;br /&gt;
===Marking a project as completed===&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;nowiki&amp;gt;{{project-approved}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{project-completed}}&amp;lt;/nowiki&amp;gt;.  If the release including the project has shipped, replace &amp;lt;nowiki&amp;gt;{{project-target}} with {{project-release|release_name}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Updating the scope or design of the project===&lt;br /&gt;
&lt;br /&gt;
Any significant updates to the project design or scope should be sent to krbdev@mit.edu.    Comments should be addressed; if blocking objections are raised  then they must be addressed.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=295</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=295"/>
				<updated>2008-04-04T00:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New section: Submitting a project for review needs work&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;br /&gt;
&lt;br /&gt;
== Submitting a project for review needs work ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Submitting a project for review&amp;quot; section indicates the submitter&lt;br /&gt;
should:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
To start the review period :&lt;br /&gt;
&lt;br /&gt;
   1. Replace {{project-early}} with {{project-review|end_of_review_date}}&lt;br /&gt;
   2. Add {{subst:project-vote}} at the bottom of the project page.&lt;br /&gt;
   3. Send mail to krbdev@mit.edu including:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But after saving the project page after following steps 1 &amp;amp; 2, this text &lt;br /&gt;
appears on the project page:&lt;br /&gt;
&lt;br /&gt;
    An announcement has been sent to krbdev@mit.edu starting a review of&lt;br /&gt;
    this project. That review will conclude on 2008-04-18.&lt;br /&gt;
&lt;br /&gt;
This is confusing as it sounds like step 3 was done automatically by the&lt;br /&gt;
wiki.  If the wiki is sending out notification automatically (and I&lt;br /&gt;
think it should) then step 3 should be removed.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=294</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=294"/>
				<updated>2008-04-03T23:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-04-18}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab given a principal name and also retrieve a master key&lt;br /&gt;
based on a given principal name and a KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard ''talk page''conventions.    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=293</id>
		<title>Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=293"/>
				<updated>2008-04-03T23:44:04Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{policy}}&lt;br /&gt;
&lt;br /&gt;
The '''Project Policy''' describes  how members of the community propose to make changes in MIT Kerberos.  A project is a proposal to add new functionality or to change existing functionality in MIT Kerberos.  Projects are reviewed by the community before  the required changes can be integrated into MIT Kerberos.  This review provides the community an opportunity to suggest improvements to the project and to confirm that the community believes that  implementing the project would be a good idea.&lt;br /&gt;
&lt;br /&gt;
==When are projects needed?==&lt;br /&gt;
&lt;br /&gt;
Small changes and relatively simple bug fixes do not require a project.   The project process is designed to provide sufficient community review.  If a change is simple enough and uncontroversial enough  then the change can be made without going through this process.  If members of the development community,especially members of [[Krbcore]], wish to review the change then it should go through a project process.  If a change is committed outside of a project and objections are raised, then any member of Krbcore may revert the change until a project is approved.&lt;br /&gt;
&lt;br /&gt;
The following always require  the project process to be invoked:&lt;br /&gt;
# Introduction of any public [[API]]s&lt;br /&gt;
# Changes in an API or the [[ABI]].  Such changes are rarely approved&lt;br /&gt;
# Significant user interface changes such as the introduction of a new dialogue .&lt;br /&gt;
# Introduction of configuration file variables or documented registry keys&lt;br /&gt;
&lt;br /&gt;
==Proposing  a project==&lt;br /&gt;
&lt;br /&gt;
To propose a project, create a new page under [[Projects]].  For example a project to create a new administration protocol might be called &amp;quot;Projects/new administration protocol&amp;quot;. &lt;br /&gt;
At the beginning of that page include the following:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{project-early}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
This will include the [[Template:project-early|early project template]] which indicates that the project is being fleshed out by its supporters and is not yet under consideration for approval.  Note, to create a page enter the page name (&amp;quot;Projects/new administration protocol&amp;quot; for example) in the wikik search box on left and click on the Go button.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The project proposal page should include the following elements:&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
It is expected that screenshots describing any proposed user interface will be included in any project that describes new interfaces.  Discussion of customer study groups that have evaluated the new interface or other information to validate the interface will help support the project.&lt;br /&gt;
&lt;br /&gt;
===Documenting proposed APIs===&lt;br /&gt;
See [[Documenting APIs]] for current recommendations on how to document APIs that are introduced in a project.  Typically, the community will expect sample code to be included describing the use of APIs that are introduced.&lt;br /&gt;
&lt;br /&gt;
==Which release does a project go in==&lt;br /&gt;
&lt;br /&gt;
Unless a project mentions it is targeting a specific release, then the project will be included in the next release [[Release branches|branched]] off the [[trunk]] after the project is checked in.&lt;br /&gt;
&lt;br /&gt;
Typically the goals of a given release are set during a release planning process at the beginning of that release process.  It is unusual to include additional projects in a release   after the planning has concluded.   A project may propose that it be included in a specific release after the goals for that release have been set, although absent a very convincing justification this is likely to result in blocking objections.&lt;br /&gt;
&lt;br /&gt;
If a project is a goal for a given release, it will typically need to include milestones  to judge its progress against the rest of the release.  If the project is being managed by the consortium staff,  then the consortium project tracking process will be used.    For projects not being done by consortium staff, it is typical to establish coordination point milestones.  See [[Meeting release goals]] for information on how these milestones are used once projects are approved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Submitting a project for review==&lt;br /&gt;
&lt;br /&gt;
Except in cases where prompt action is required, projects require a two week review cycle.  Projects require at least one  yes vote from a member of Krbcore  who has not been a primary proponent of the project to be approved and no blocking objections.    Proponents of the project should work  with members of the community to address suggestions that are raised even if these suggestions are not blocking objections.   If discussion of significant issues is ongoing when the review period extends then approval should be delayed until the discussion concludes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To start the review period :&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-early}} with {{project-review|end_of_review_date}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# Add &amp;lt;nowiki&amp;gt;{{subst:project-vote}}&amp;lt;/nowiki&amp;gt; at the bottom of the project page.&lt;br /&gt;
# Send mail  to krbdev@mit.edu including:&lt;br /&gt;
##The URI to the project page&lt;br /&gt;
##The end of the review period&lt;br /&gt;
##Cut and paste the description of the project from the project page into the review.&lt;br /&gt;
&lt;br /&gt;
==That's a good start==&lt;br /&gt;
&lt;br /&gt;
Often the result of a review will be that what is written so far is good enough that the community wants to explore the project, but checkpoints or '''review gates''' are required.  Examples of such gates include things like  requesting review of design of a particular part of the system, requesting review of APIs that are designed in the future, or interactions with  some part of the system.  Particularly when some of the recommended information is not included in the original project proposal, a review gate may be requested.  When the information to be reviewed is available, another project review should be conducted.  There are no specific details on how to  document this review other than that the &amp;lt;nowiki&amp;gt;{{project-review}}&amp;lt;/nowiki&amp;gt; template should be used so that the project is categorized as under review.&lt;br /&gt;
&lt;br /&gt;
== Project life cycle changes==&lt;br /&gt;
&lt;br /&gt;
===Approving a project===&lt;br /&gt;
&lt;br /&gt;
If the project review concludes successfully  then:&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-review}} with {{project-approved}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Add a ''Current status'' section at the bottom of the project page to track updates&lt;br /&gt;
# Send mail to krbdev@mit.edu noting that the project is approved.&lt;br /&gt;
# If the project is targeted for a specific release add &amp;lt;nowiki&amp;gt;{{project-target|release_name}}&amp;lt;/nowiki&amp;gt; below the project-approved target.&lt;br /&gt;
&lt;br /&gt;
===Marking a project as completed===&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;nowiki&amp;gt;{{project-approved}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{project-completed}}&amp;lt;/nowiki&amp;gt;.  If the release including the project has shipped, replace &amp;lt;nowiki&amp;gt;{{project-target}} with {{project-release|release_name}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Updating the scope or design of the project===&lt;br /&gt;
&lt;br /&gt;
Any significant updates to the project design or scope should be sent to krbdev@mit.edu.    Comments should be addressed; if blocking objections are raised  then they must be addressed.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=292</id>
		<title>Projects/Masterkey Keytab Stash</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/Masterkey_Keytab_Stash&amp;diff=292"/>
				<updated>2008-04-03T23:43:27Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New page: {{project-early}}  =Desired changes=  The point of this small project is to change the format of the master key stash file to that of a keytab type file.  This will allow the master key's ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
=Desired changes=&lt;br /&gt;
&lt;br /&gt;
The point of this small project is to change the format of the master&lt;br /&gt;
key stash file to that of a keytab type file.  This will allow the&lt;br /&gt;
master key's KVNO to be stored along with its enctype and key data which&lt;br /&gt;
in turn will enable an efficient implementation of master key updating.&lt;br /&gt;
&lt;br /&gt;
=Functional Requirements=&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to access the most recent master key in the&lt;br /&gt;
masterkey keytab given a principal name and also retrieve a master key&lt;br /&gt;
based on a given principal name and a KVNO and or enctype.  If the&lt;br /&gt;
masterkey is stored in the old stash file format then the KDC will be&lt;br /&gt;
backwards compatible and still be able to access the masterkey.&lt;br /&gt;
&lt;br /&gt;
The utilities (kdb5_util, kdb_ldap_util, ktutil) must be able to read&lt;br /&gt;
and write to a masterkey keytab.&lt;br /&gt;
&lt;br /&gt;
=Design of implementation=&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() and krb5_db_def_fetch_mkey() functions would&lt;br /&gt;
be modified to use the keytab functions found in libkrb5.&lt;br /&gt;
&lt;br /&gt;
The krb5_db_def_fetch_mkey() function would first try to read the master&lt;br /&gt;
key stash as a keytab file using krb5_kt_get_entry() and if that fails&lt;br /&gt;
it would fall back to using the current stash code to treat the stash&lt;br /&gt;
file as an old format stash file.  Note that this function already has a&lt;br /&gt;
kvno arg that can be used for input and output.&lt;br /&gt;
&lt;br /&gt;
The krb5_def_store_mkey() interface would be modified to write a keytab&lt;br /&gt;
and to accept an optional KVNO argument.  It would need to deal with&lt;br /&gt;
existing old stash format files so the code would test to see if the&lt;br /&gt;
stash file existed and was non-0 size and if so, would first try reading&lt;br /&gt;
it as a keytab.  If the stash file is determined to be a keytab by a&lt;br /&gt;
successful call to krb5_kt_get_entry() and the principal name is&lt;br /&gt;
verified to be correct then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the new masterkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
If krb5_kt_get_entry() returned an error then the stash file would be&lt;br /&gt;
truncated to 0 bytes and then krb5_kt_add_entry() would be called to add&lt;br /&gt;
the masterkey entry.  If the stash file did not exist or was 0 bytes in&lt;br /&gt;
size then krb5_kt_add_entry() would be called directly.  The reason for&lt;br /&gt;
detecting and an existing old format stash file is to allow&lt;br /&gt;
krb5_def_store_mkey() the ability to store &amp;gt; 1 masterkey.  Since&lt;br /&gt;
krb5_kt_add_entry() always appends to a keytab care must be taken to&lt;br /&gt;
ensure the existing stash file is a keytab and not the old format stash.&lt;br /&gt;
&lt;br /&gt;
Callers of krb5_def_store_mkey() would need to be modified to deal with&lt;br /&gt;
the new KVNO argument.  If a user specified KVNO was passed in and a key&lt;br /&gt;
with that KVNO existed in the keytab, an error would be returned&lt;br /&gt;
otherwise a new key with that KVNO would be added to the keytab.  If a&lt;br /&gt;
KVNO was not specified, the current behavior whose KVNO would either be&lt;br /&gt;
0 if no keys exist in the keytab or would be one greater than the&lt;br /&gt;
largest KVNO found in the keytab. &lt;br /&gt;
&lt;br /&gt;
The kdb5_util interface would be modified to allow the user to specify&lt;br /&gt;
the KVNO.  The code will return an error if kdb5_util attemps to add a&lt;br /&gt;
key with a user specified KVNO to the masterkey keytab and a key with&lt;br /&gt;
that same KVNO already exists in the keytab.  At that point the user&lt;br /&gt;
would either to use ktutil at that point to remove the existing key,&lt;br /&gt;
specify a different KVNO, or just remove the keytab file and rerun the&lt;br /&gt;
kdb5_util command.&lt;br /&gt;
&lt;br /&gt;
Note the default file name convention currently used for stash files&lt;br /&gt;
will be used for masterkey keytab files.  One implication of this is&lt;br /&gt;
that once an admin overwrites an existing old format stash file with the&lt;br /&gt;
new keytab format there is no going back to the old format as kdb5_util&lt;br /&gt;
will not support creation of the old format.&lt;br /&gt;
&lt;br /&gt;
=Tasks/milestones=&lt;br /&gt;
&lt;br /&gt;
* project start.  Apr  3, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~2 week&lt;br /&gt;
* test.  ~1 week&lt;br /&gt;
* code review.  ~1 week&lt;br /&gt;
* documentation.  ~1 day&lt;br /&gt;
&lt;br /&gt;
=Desired integration and release goals=&lt;br /&gt;
&lt;br /&gt;
Integrate and test before 1.7 release. &lt;br /&gt;
&lt;br /&gt;
=Testing plan=&lt;br /&gt;
&lt;br /&gt;
Unit testing of stash file related functions will be performed to make&lt;br /&gt;
sure the krb5kdc, kadmind, kadmin, kadmin.local, kdb5_util, and ktutil&lt;br /&gt;
are able to access and administer the masterkey keytab file.  Tests will&lt;br /&gt;
be done for these scenarios:&lt;br /&gt;
&lt;br /&gt;
*  An old format stash file exists.  The krb5kdc and kadmind should be&lt;br /&gt;
able to read the masterkey.  The kdb5_util stash and create commands&lt;br /&gt;
should be able to overwrite the stash file.&lt;br /&gt;
&lt;br /&gt;
* No stash exists.  kdb5_util should be able to create a masterkey&lt;br /&gt;
keytab stash. &lt;br /&gt;
&lt;br /&gt;
* The daemons that require masterkey access will be tested to validate&lt;br /&gt;
the ability to read the masterkey in a keytab.&lt;br /&gt;
&lt;br /&gt;
Regression testing will be running the tests in the MIT source tree that&lt;br /&gt;
test the function of the krb5kdc, kadmind, kadmin, kadmin.local,&lt;br /&gt;
kdb5_util, and ktutil.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=273</id>
		<title>Talk:Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Project_policy&amp;diff=273"/>
				<updated>2008-03-31T19:34:07Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New page: I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't see a link from the project policy on the k5wiki to code change/integration policy.  So I do not know if a code review is necessary and what sort of testing is expected.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=272</id>
		<title>Project policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Project_policy&amp;diff=272"/>
				<updated>2008-03-31T19:33:29Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{policy}}&lt;br /&gt;
&lt;br /&gt;
The '''Project Policy''' describes  how members of the community propose to make changes in MIT Kerberos.  A project is a proposal to add new functionality or to change existing functionality in MIT Kerberos.  Projects are reviewed by the community before  the required changes can be integrated into MIT Kerberos.  This review provides the community an opportunity to suggest improvements to the project and to confirm that the community believes that  implementing the project would be a good idea.&lt;br /&gt;
&lt;br /&gt;
==When are projects needed?==&lt;br /&gt;
&lt;br /&gt;
Small changes and relatively simple bug fixes do not require a project.   The project process is designed to provide sufficient community review.  If a change is simple enough and uncontroversial enough  then the change can be made without going through this process.  If members of the development community,especially members of [[Krbcore]], wish to review the change then it should go through a project process.  If a change is committed outside of a project and objections are raised, then any member of Krbcore may revert the change until a project is approved.&lt;br /&gt;
&lt;br /&gt;
The following always require  the project process to be invoked:&lt;br /&gt;
# Introduction of any public [[API]]s&lt;br /&gt;
# Changes in an API or the [[ABI]].  Such changes are rarely approved&lt;br /&gt;
# Significant user interface changes such as the introduction of a new dialogue .&lt;br /&gt;
# Introduction of configuration file variables or documented registry keys&lt;br /&gt;
&lt;br /&gt;
==Proposing  a project==&lt;br /&gt;
&lt;br /&gt;
To propose a project, create a new page under [[Projects]].  For example a project to create a new administration protocol might be called &amp;quot;Projects/new administration protocol&amp;quot;. &lt;br /&gt;
At the beginning of that page include the following:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{project-early}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
This will include the [[Template:project-early|early project template]] which indicates that the project is being fleshed out by its supporters and is not yet under consideration for approval.  Note, to create a page enter the page name (&amp;quot;Projects/new administration protocol&amp;quot; for example) in the wikik search box on left and click on the Search button.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The project proposal page should include the following elements:&lt;br /&gt;
* A description of the desired change in functionality&lt;br /&gt;
* Any functional requirements that must be met for the project to be successful&lt;br /&gt;
* A design for how the  desired functionality will be implemented&lt;br /&gt;
* A breakdown of tasks  or milestones to judge  progress of the project&lt;br /&gt;
* Screenshots or other proposed user interface  descriptions&lt;br /&gt;
* Documentation and sample  code for any APIs that are proposed&lt;br /&gt;
* Dependencies on other projects&lt;br /&gt;
* Information on desired integration and release goals&lt;br /&gt;
* Testing plan&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
It is expected that screenshots describing any proposed user interface will be included in any project that describes new interfaces.  Discussion of customer study groups that have evaluated the new interface or other information to validate the interface will help support the project.&lt;br /&gt;
&lt;br /&gt;
===Documenting proposed APIs===&lt;br /&gt;
See [[Documenting APIs]] for current recommendations on how to document APIs that are introduced in a project.  Typically, the community will expect sample code to be included describing the use of APIs that are introduced.&lt;br /&gt;
&lt;br /&gt;
==Which release does a project go in==&lt;br /&gt;
&lt;br /&gt;
Unless a project mentions it is targeting a specific release, then the project will be included in the next release [[Release branches|branched]] off the [[trunk]] after the project is checked in.&lt;br /&gt;
&lt;br /&gt;
Typically the goals of a given release are set during a release planning process at the beginning of that release process.  It is unusual to include additional projects in a release   after the planning has concluded.   A project may propose that it be included in a specific release after the goals for that release have been set, although absent a very convincing justification this is likely to result in blocking objections.&lt;br /&gt;
&lt;br /&gt;
If a project is a goal for a given release, it will typically need to include milestones  to judge its progress against the rest of the release.  If the project is being managed by the consortium staff,  then the consortium project tracking process will be used.    For projects not being done by consortium staff, it is typical to establish coordination point milestones.  See [[Meeting release goals]] for information on how these milestones are used once projects are approved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Submitting a project for review==&lt;br /&gt;
&lt;br /&gt;
Except in cases where prompt action is required, projects require a two week review cycle.  Projects require at least one  yes vote from a member of Krbcore  who has not been a primary proponent of the project to be approved and no blocking objections.    Proponents of the project should work  with members of the community to address suggestions that are raised even if these suggestions are not blocking objections.   If discussion of significant issues is ongoing when the review period extends then approval should be delayed until the discussion concludes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To start the review period :&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-early}} with {{project-review|end_of_review_date}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# Add &amp;lt;nowiki&amp;gt;{{subst:project-vote}}&amp;lt;/nowiki&amp;gt; at the bottom of the project page.&lt;br /&gt;
# Send mail  to krbdev@mit.edu including:&lt;br /&gt;
##The URI to the project page&lt;br /&gt;
##The end of the review period&lt;br /&gt;
##Cut and paste the description of the project from the project page into the review.&lt;br /&gt;
&lt;br /&gt;
==That's a good start==&lt;br /&gt;
&lt;br /&gt;
Often the result of a review will be that what is written so far is good enough that the community wants to explore the project, but checkpoints or '''review gates''' are required.  Examples of such gates include things like  requesting review of design of a particular part of the system, requesting review of APIs that are designed in the future, or interactions with  some part of the system.  Particularly when some of the recommended information is not included in the original project proposal, a review gate may be requested.  When the information to be reviewed is available, another project review should be conducted.  There are no specific details on how to  document this review other than that the &amp;lt;nowiki&amp;gt;{{project-review}}&amp;lt;/nowiki&amp;gt; template should be used so that the project is categorized as under review.&lt;br /&gt;
&lt;br /&gt;
== Project life cycle changes==&lt;br /&gt;
&lt;br /&gt;
===Approving a project===&lt;br /&gt;
&lt;br /&gt;
If the project review concludes successfully  then:&lt;br /&gt;
# Replace &amp;lt;nowiki&amp;gt;{{project-review}} with {{project-approved}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Add a ''Current status'' section at the bottom of the project page to track updates&lt;br /&gt;
# Send mail to krbdev@mit.edu noting that the project is approved.&lt;br /&gt;
# If the project is targeted for a specific release add &amp;lt;nowiki&amp;gt;{{project-target|release_name}}&amp;lt;/nowiki&amp;gt; below the project-approved target.&lt;br /&gt;
&lt;br /&gt;
===Marking a project as completed===&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;nowiki&amp;gt;{{project-approved}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{project-completed}}&amp;lt;/nowiki&amp;gt;.  If the release including the project has shipped, replace &amp;lt;nowiki&amp;gt;{{project-target}} with {{project-release|release_name}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Updating the scope or design of the project===&lt;br /&gt;
&lt;br /&gt;
Any significant updates to the project design or scope should be sent to krbdev@mit.edu.    Comments should be addressed; if blocking objections are raised  then they must be addressed.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Talk:Projects&amp;diff=271</id>
		<title>Talk:Projects</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Talk:Projects&amp;diff=271"/>
				<updated>2008-03-31T19:27:28Z</updated>
		
		<summary type="html">&lt;p&gt;Wfiveash: New page: The Projects page should list the various consortium projects.  The current  list of Project policy and Category:Projects is a bit confusing and indirect.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Projects page should list the various consortium projects.  The current  list of Project policy and Category:Projects is a bit confusing and indirect.&lt;/div&gt;</summary>
		<author><name>Wfiveash</name></author>	</entry>

	</feed>