<?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=Npmccallum</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=Npmccallum"/>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki/Special:Contributions/Npmccallum"/>
		<updated>2026-05-12T19:21:23Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5434</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5434"/>
				<updated>2015-02-24T15:32:09Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Definitions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
_mskkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# URI record prefix name&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first four, I propose:&lt;br /&gt;
&lt;br /&gt;
# _mskkdcp&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# In the case of the U flag, MSKKDCP. Otherwise, UDP or TCP (at the client's discretion).&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5433</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5433"/>
				<updated>2015-02-24T15:31:41Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Definitions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
_mskkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# URI record prefix name&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first four, I propose:&lt;br /&gt;
&lt;br /&gt;
# _mskkdcp&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# In the case of the U flag, MSKKDCP. Otherwise, UDP or TCP (at the client's discretion).&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this thought.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5432</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5432"/>
				<updated>2015-02-24T01:38:50Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Definitions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
_mskkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first three, I propose:&lt;br /&gt;
&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# In the case of the U flag, MSKKDCP. Otherwise, UDP or TCP (at the client's discretion).&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this thought.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5431</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5431"/>
				<updated>2015-02-24T01:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* The URI Record */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
_mskkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first three, I propose:&lt;br /&gt;
&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# UDP or TCP at the client's discretion&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this thought.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5430</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5430"/>
				<updated>2015-02-24T01:28:49Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
_ms_kkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first three, I propose:&lt;br /&gt;
&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# UDP or TCP at the client's discretion&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this thought.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5429</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5429"/>
				<updated>2015-02-24T01:22:32Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
_ms_kkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string and a domain. For kerberos, both of these are the realm (in this case, example.com).&lt;br /&gt;
&lt;br /&gt;
First, we query NAPTR for the domain (a.k.a. realm). Here is what a response might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;D&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;&amp;quot; _mskkdcp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; _kerberos._udp.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;S&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; _kerberos._tcp.example.com.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this example, the client is instructed to try the MS-KKDCP proxy first. If this fails, it can fall back to TCP or UDP. These lookups will be performed in two stages. First, the NAPTR record will be fetched. From this the method is chosen. Second, the chosen method is queried. For MS-KKDCP, a URI record is queried via the &amp;quot;D&amp;quot; flag. For the others, an SRV record is queried from the &amp;quot;S&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
For DNS servers which do not support the URI records, NAPTRs can be used to generate URIs themselves via the &amp;quot;U&amp;quot; flag. In this case, no secondary lookup is performed. Secondary queries can be avoided for TCP/UDP as well using the &amp;quot;A&amp;quot; flag. Here are examples of both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 10 &amp;quot;U&amp;quot; &amp;quot;KRB5+MSKKDCP&amp;quot; &amp;quot;!^.*$!https://kdc.example.com/kdc!&amp;quot; .&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+UDP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5+TCP&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the administrator does not wish to control TCP or UDP, the protocol portion of the field can be ignored. For instance, this case supports either UDP or TCP:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;A&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; kdc.example.com.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On last thing should be mentioned that is not kerberos specific: NAPTR allows redirection. This is usually done by specifying no flag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
example.com IN NAPTR 100 20 &amp;quot;&amp;quot; &amp;quot;KRB5&amp;quot; &amp;quot;&amp;quot; foo.com.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, a second NAPTR lookup would be perormed, this time on foo.com. The realm itself, however, would remain unchanged.&lt;br /&gt;
&lt;br /&gt;
= Definitions =&lt;br /&gt;
&lt;br /&gt;
Most of the NAPTR and URI protocols are already well defined. What kerberos would need to standardize is:&lt;br /&gt;
&lt;br /&gt;
# Service name&lt;br /&gt;
# Protocol names&lt;br /&gt;
# The behavior of a service without a protocol&lt;br /&gt;
# The behavior of the &amp;quot;P&amp;quot; flag (optional)&lt;br /&gt;
&lt;br /&gt;
For the first three, I propose:&lt;br /&gt;
&lt;br /&gt;
# KRB5&lt;br /&gt;
# UDP, TCP and MSKKDCP&lt;br /&gt;
# UDP or TCP at the client's discretion&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;P&amp;quot; flag is essentially a standardized way to add protocol specific behavior given the evaluation of the regular expression. One possible thought is the use of this flag for realm moves. However, I have not thought through the ramifications of this thought.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5428</id>
		<title>Projects/NAPTR</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/NAPTR&amp;diff=5428"/>
				<updated>2015-02-23T23:33:04Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: New page: = Background =  The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Background =&lt;br /&gt;
&lt;br /&gt;
The original driver of this proposal is the desire to enable automatic detection of MS-KKDCP compliant proxies. However, after researching the new proposed standard for the [https://tools.ietf.org/html/draft-faltstrom-uri-11 URI Record type] and its relation to [https://www.ietf.org/rfc/rfc2915.txt NAPTR records], I think NAPTR provides improvements in other areas as well.&lt;br /&gt;
&lt;br /&gt;
= The URI Record =&lt;br /&gt;
&lt;br /&gt;
This is basically an equivalent for SRV records but for URIs. An example might be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
_ms_kkdcp IN URI 10 1 &amp;quot;https://kdc.example.com/kdc&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A URI record on its own might suffice. However, getting the interaction right between this and the two SRV records may be challenging. Notice that the URI record type provides priority and weight fields. While this gives us an indication of how to prioritize traffic across multiple proxy URIs, it does not explain how to do the same between MS-KKDCP and TCP/UDP.&lt;br /&gt;
&lt;br /&gt;
= The NAPTR Record =&lt;br /&gt;
&lt;br /&gt;
The NAPTR record type can alleviate this interaction problem. NAPTR records are evaluated with a string, which in this case will be the principal (including the realm), and a domain (which is only the realm).&lt;br /&gt;
&lt;br /&gt;
(More to come...)&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5419</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5419"/>
				<updated>2014-10-31T19:42:07Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
PAKE preauthentication also has benefits when not using a second factor. Namely, both sides are authenticated and no time synchronization is required.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Choose a client-supported PAKEProfile.&lt;br /&gt;
# Choose a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Choose which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash: h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt; = H(2FInfo).&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the principal's secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo: h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt; = H(2FInfo).&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. In this case, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Security Considerations = &lt;br /&gt;
Presuming that the underlying PAKE is secure, the shared key should be secure and no details about the first factor should be available to an active or passive attacker.&lt;br /&gt;
&lt;br /&gt;
We do not provide any sort of integrity for the PAKESupport message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation. The client and KDC should disable any weak PAKEProfile.&lt;br /&gt;
&lt;br /&gt;
Because the hash of 2FInfo appears in the key confirmation, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
* No downgrade attack is possible on the KDC's:&lt;br /&gt;
** etype choice&lt;br /&gt;
** 2FA requirement&lt;br /&gt;
** 2FA methods&lt;br /&gt;
* If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Timing attacks are a clear concern. The KDC needs to ensure that the same amount of time is spent no matter which factor fails to validate.&lt;br /&gt;
&lt;br /&gt;
Similarly, if subsequent 2FA roundtrips are required, they should be initiated only after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== FIDO Alliance - U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5418</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5418"/>
				<updated>2014-10-31T19:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
PAKE preauthentication also has benefits when not using a second factor. Namely, both sides are authenticated and no time synchronization is required.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== Implementation Considerations ==&lt;br /&gt;
=== Client Roundtrips ===&lt;br /&gt;
The MIT Kerberos client will likely require some core modification to handle the number of roundtrips required by this protocol.&lt;br /&gt;
&lt;br /&gt;
=== KDC State ===&lt;br /&gt;
The KDC is generally stateless. Some mechanism will be needed to carry state across the roundtrips. Using PA-FX-COOKIE is probably the simplist. However, this will also likely break forward secrecy. Careful thought will be required for the implementation.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client. We do not provide any sort of integrety on this message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Decide upon a client-supported PAKEProfile.&lt;br /&gt;
# Decide upon a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Decide which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash: h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt; = H(2FInfo).&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the principal's secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo: h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt; = H(2FInfo).&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, h&amp;lt;sub&amp;gt;2finfo&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because the hash of 2FInfo appears in the key confirmation, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
# No downgrade attack is possible for the requirement of a 2FA.&lt;br /&gt;
# No downgrade attack is possible for the 2FA methods.&lt;br /&gt;
# If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Special care should be taken by the KDC to avoid timing attacks if a second factor is present so as not to reveal to the client whether the first or second factor has failed. The second factor will often take several orders of magnitude more time than the first factor to validate.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. It is strongly recommended that subsequent roundtrips only be initiated after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
If subsequent roundtrips are required for 2FA, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
As noted above, the 2F should already be verified. &lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== FIDO Alliance - U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5417</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5417"/>
				<updated>2014-10-31T17:42:55Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Rationale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
PAKE preauthentication also has benefits when not using a second factor. Namely, both sides are authenticated and no time synchronization is required.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== Implementation Considerations ==&lt;br /&gt;
=== Client Roundtrips ===&lt;br /&gt;
The MIT Kerberos client will likely require some core modification to handle the number of roundtrips required by this protocol.&lt;br /&gt;
&lt;br /&gt;
=== KDC State ===&lt;br /&gt;
The KDC is generally stateless. Some mechanism will be needed to carry state across the roundtrips. Using PA-FX-COOKIE is probably the simplist. However, this will also likely break forward secrecy. Careful thought will be required for the implementation.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client. We do not provide any sort of integrety on this message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Decide upon a client-supported PAKEProfile.&lt;br /&gt;
# Decide upon a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Decide which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash.&lt;br /&gt;
# Select a secret key and derive it using the previously created 2FInfo hash.&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the derived secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Because the secret is derived using a hash of the contents of 2FInfo, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
# No downgrade attack is possible for the etype.&lt;br /&gt;
# No downgrade attack is possible for the requirement of a 2FA.&lt;br /&gt;
# No downgrade attack is possible for the 2FA methods.&lt;br /&gt;
# If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo.&lt;br /&gt;
# Derives the password using the above hash.&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Special care should be taken by the KDC to avoid timing attacks if a second factor is present so as not to reveal to the client whether the first or second factor has failed. The second factor will often take several orders of magnitude more time than the first factor to validate.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. It is strongly recommended that subsequent roundtrips only be initiated after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
If subsequent roundtrips are required for 2FA, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
As noted above, the 2F should already be verified. &lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== FIDO Alliance - U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5415</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5415"/>
				<updated>2014-10-31T17:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Projects/PAKE 2FA moved to Projects/PAKE Preauthentication&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== Implementation Considerations ==&lt;br /&gt;
=== Client Roundtrips ===&lt;br /&gt;
The MIT Kerberos client will likely require some core modification to handle the number of roundtrips required by this protocol.&lt;br /&gt;
&lt;br /&gt;
=== KDC State ===&lt;br /&gt;
The KDC is generally stateless. Some mechanism will be needed to carry state across the roundtrips. Using PA-FX-COOKIE is probably the simplist. However, this will also likely break forward secrecy. Careful thought will be required for the implementation.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client. We do not provide any sort of integrety on this message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Decide upon a client-supported PAKEProfile.&lt;br /&gt;
# Decide upon a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Decide which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash.&lt;br /&gt;
# Select a secret key and derive it using the previously created 2FInfo hash.&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the derived secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Because the secret is derived using a hash of the contents of 2FInfo, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
# No downgrade attack is possible for the etype.&lt;br /&gt;
# No downgrade attack is possible for the requirement of a 2FA.&lt;br /&gt;
# No downgrade attack is possible for the 2FA methods.&lt;br /&gt;
# If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo.&lt;br /&gt;
# Derives the password using the above hash.&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Special care should be taken by the KDC to avoid timing attacks if a second factor is present so as not to reveal to the client whether the first or second factor has failed. The second factor will often take several orders of magnitude more time than the first factor to validate.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. It is strongly recommended that subsequent roundtrips only be initiated after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
If subsequent roundtrips are required for 2FA, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
As noted above, the 2F should already be verified. &lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== FIDO Alliance - U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_2FA&amp;diff=5416</id>
		<title>Projects/PAKE 2FA</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_2FA&amp;diff=5416"/>
				<updated>2014-10-31T17:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Projects/PAKE 2FA moved to Projects/PAKE Preauthentication&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Projects/PAKE Preauthentication]]&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5414</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5414"/>
				<updated>2014-10-31T17:40:25Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== Implementation Considerations ==&lt;br /&gt;
=== Client Roundtrips ===&lt;br /&gt;
The MIT Kerberos client will likely require some core modification to handle the number of roundtrips required by this protocol.&lt;br /&gt;
&lt;br /&gt;
=== KDC State ===&lt;br /&gt;
The KDC is generally stateless. Some mechanism will be needed to carry state across the roundtrips. Using PA-FX-COOKIE is probably the simplist. However, this will also likely break forward secrecy. Careful thought will be required for the implementation.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client. We do not provide any sort of integrety on this message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Decide upon a client-supported PAKEProfile.&lt;br /&gt;
# Decide upon a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Decide which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash.&lt;br /&gt;
# Select a secret key and derive it using the previously created 2FInfo hash.&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the derived secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Because the secret is derived using a hash of the contents of 2FInfo, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
# No downgrade attack is possible for the etype.&lt;br /&gt;
# No downgrade attack is possible for the requirement of a 2FA.&lt;br /&gt;
# No downgrade attack is possible for the 2FA methods.&lt;br /&gt;
# If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo.&lt;br /&gt;
# Derives the password using the above hash.&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Special care should be taken by the KDC to avoid timing attacks if a second factor is present so as not to reveal to the client whether the first or second factor has failed. The second factor will often take several orders of magnitude more time than the first factor to validate.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. It is strongly recommended that subsequent roundtrips only be initiated after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
If subsequent roundtrips are required for 2FA, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
As noted above, the 2F should already be verified. &lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== FIDO Alliance - U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5413</id>
		<title>Projects/PAKE Preauthentication</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/PAKE_Preauthentication&amp;diff=5413"/>
				<updated>2014-10-31T17:33:45Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: New page: = Rationale =  Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rationale =&lt;br /&gt;
&lt;br /&gt;
Multi-factor authentication is a highly desired feature. This lead first to the creation of an OTP preauthentication mechanism (RFC 6560). This mechanism sends the OTP over the wire, but encrypted inside of FAST.&lt;br /&gt;
&lt;br /&gt;
While this works, it is somewhat less than optimal. FAST can be difficult for clients to configure. This lead to some initial thoughts regarding the question of OTP Deployability ([[Projects/Improve OTP deployability]]).&lt;br /&gt;
&lt;br /&gt;
The best idea to come out of this discussion was to use the first factor to complete a PAKE exchange and then use the exchanged key to encrypt the second factor. So long as only a single round-trip is used to complete the second factor validation, it is possible to evaluate the first and second factors simultaneously. Even when such may not be possible, account locking policy (or some other mechanism) can be used to prevent online dictionary attacks.&lt;br /&gt;
&lt;br /&gt;
= Protocol Overview =&lt;br /&gt;
&lt;br /&gt;
This preauthentication mechanism differs a bit from establish mechanisms in that it takes an arbitrary number of roundtrips to complete. This varies based upon the PAKE algorithm and the second factor used (if any). At a minimum, two roundtrips are necessary. This is made possible by using KDC_ERR_MORE_PREAUTH_DATA_REQUIRED.&lt;br /&gt;
&lt;br /&gt;
== First Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
In the first roundtrip, the client MUST include PA-PAKE padata of PAKESupport. This indicates to the KDC which PAKE methods are supported by the client. We do not provide any sort of integrety on this message and as such a downgrade attack is possible. This behaves similarly to the etype negotiation.&lt;br /&gt;
&lt;br /&gt;
=== Response (KrbError) ===&lt;br /&gt;
Upon receiving the AS-REQ message, the KDC will:&lt;br /&gt;
# Decide upon a client-supported PAKEProfile.&lt;br /&gt;
# Decide upon a client-supported etype with good security properties for the selected PAKEProfile.&lt;br /&gt;
# Decide which second factors are configured, required and/or need to present challenges.&lt;br /&gt;
# Generate the 2FInfo data structure, encode and hash it using the PAKEProfile specified hash.&lt;br /&gt;
# Select a secret key and derive it using the previously created 2FInfo hash.&lt;br /&gt;
# Construct the first PAKEProfile-specific PAKEMessage using the derived secret key.&lt;br /&gt;
# Construct the PAKEStart padata and return it to the client (KDC_ERR_PREAUTH_REQUIRED).&lt;br /&gt;
&lt;br /&gt;
Because the secret is derived using a hash of the contents of 2FInfo, several important properties arise. If an active attacker tampers with the contents of 2FInfo, the key exchange will fail to verify. This guarantees:&lt;br /&gt;
# No downgrade attack is possible for the etype.&lt;br /&gt;
# No downgrade attack is possible for the requirement of a 2FA.&lt;br /&gt;
# No downgrade attack is possible for the 2FA methods.&lt;br /&gt;
# If a 2FA method provides a challenge, it has integrety protection.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of the KrbError, the client:&lt;br /&gt;
# Prompts for the password and any second factor information required.&lt;br /&gt;
# Salts the password using ETYPE-INFO2-ENTRY.&lt;br /&gt;
# Hashes the encoded contents of 2FInfo.&lt;br /&gt;
# Derives the password using the above hash.&lt;br /&gt;
&lt;br /&gt;
== Intermediate PAKE Roundtrips (Optional) ==&lt;br /&gt;
Depending on the PAKEProfile chosen, additional roundtrips may be required to complete the key exchange. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKEMessage. The number of intermediate roundtrips here is PAKEProfile specific and may be zero or more. However, the PAKE algorithm in any given PAKEProfile MUST be symmetric.&lt;br /&gt;
&lt;br /&gt;
== Last PAKE Roundtrip ==&lt;br /&gt;
=== Request (AS-REQ) ===&lt;br /&gt;
After any intermediate PAKE roundtrips are completed, the client is on the last step of the (symmetric) PAKE. The client should have, at this point:&lt;br /&gt;
* The KDC's public key.&lt;br /&gt;
* The 2FA response (optional).&lt;br /&gt;
&lt;br /&gt;
The client then:&lt;br /&gt;
# Calculates the shared key (K).&lt;br /&gt;
# Derives two new keys from the shared key (K): K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Generates the key confirmation (PAKEProfile) hash: H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Encrypts any 2FA-specific response: E(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa).&lt;br /&gt;
# Generates PAKEFinish with the last PAKE-specific message, the key confirmation and the 2fa message (optional).&lt;br /&gt;
# Sends AS-REQ with PA-PAKE as PAKEFinish.&lt;br /&gt;
&lt;br /&gt;
=== Response (AS-REP or KrbError) ===&lt;br /&gt;
At this point the KDC, in most cases, will have everything it needs to complete verification. It uses the final PAKEMessage in PAKEFinish to calculate the shared key (K). This will be the same as the client's K if and only if the password, salt and 2FInfo hash are the same. The KDC now:&lt;br /&gt;
# Derives three new keys from K: K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
# Verifies key confirmation: kconf == H(K&amp;lt;sub&amp;gt;kconf&amp;lt;/sub&amp;gt;).&lt;br /&gt;
# Decrypts and verifies the second factor (if present): verify(D(K&amp;lt;sub&amp;gt;2fa&amp;lt;/sub&amp;gt;, 2fa)).&lt;br /&gt;
# If all factors validate, the TGT is sent in an AS-REP encrypted with K&amp;lt;sub&amp;gt;tgt&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Special care should be taken by the KDC to avoid timing attacks if a second factor is present so as not to reveal to the client whether the first or second factor has failed. The second factor will often take several orders of magnitude more time than the first factor to validate.&lt;br /&gt;
&lt;br /&gt;
With some 2FA methods, additional roundtrips may be required. It is strongly recommended that subsequent roundtrips only be initiated after the 2FA has already been verified. A failure to do this opens up the system to an independant online dictionary attack on the first factor. However, if this is not possible, this may be mitigated by an account locking policy. But again, this can be simply avoided by validating the 2F without subsequent roundtrips.&lt;br /&gt;
&lt;br /&gt;
If subsequent roundtrips are required for 2FA, the KDC MUST return KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) with PA-PAKE of PAKESecondFactor.&lt;br /&gt;
&lt;br /&gt;
== Subsequent 2F Roundtrips (Optional) ==&lt;br /&gt;
&lt;br /&gt;
Subsequent roundtrips may be required for 2FA. This includes subsequent AS-REQs and KrbError(KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) responses. These contain PA-PAKE padata of PAKESecondFactor. &lt;br /&gt;
&lt;br /&gt;
An example of a subsequent 2F roundtrip is OTP synchronization after the first code has already been verified.&lt;br /&gt;
&lt;br /&gt;
As noted above, the 2F should already be verified. &lt;br /&gt;
&lt;br /&gt;
The conclusion of all subsequent 2F rountrips MUST be either an AS-REP or a final KrbError. &lt;br /&gt;
&lt;br /&gt;
= Proposed PAKEs =&lt;br /&gt;
A brief note is necessary about elliptic curve cryptogrpahy (ECC). The standard integer Diffie-Hellman is rapidly becoming cumbersome. ECC provides an answer for this. PAKEProfile is flexible enough to support non-ECC based PAKEs, but at this time we are only focusing on implementing ECC PAKEs.&lt;br /&gt;
&lt;br /&gt;
== JPAKE ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling JPAKE] is a PAKE algorithm with a formal security proof. It is compatible with ECC without fancy tricks. It is broadly implemented (including OpenSSL, NSS and BouncyCastle). There are no known patents covering it. The only major downside of using it is that it requires two roundtrips.&lt;br /&gt;
&lt;br /&gt;
= Proposed 2FA Methods =&lt;br /&gt;
Given that 2FA methods are expandable in this protocol, it is preferred that each type of 2FA create its own method. This will void having to create a 2FA method &amp;quot;to rule them all&amp;quot; and failing.&lt;br /&gt;
&lt;br /&gt;
== OATH (HOTP, TOTP, OCRA) ==&lt;br /&gt;
HOTP (RFC 4226) and TOTP (RFC 6238) make great options for this protocol. A (very) simple example implementation is provided. OCRA (RFC 6287) support would be ideal as well; but more research is needed for this.&lt;br /&gt;
&lt;br /&gt;
== U2F ==&lt;br /&gt;
[https://fidoalliance.org/specifications/download U2F] is the new cryptographic hardware challenge/response based on USB / Bluetooth HID. It is a clever design and provides great usability. More research is needed.&lt;br /&gt;
&lt;br /&gt;
= Implementation Details =&lt;br /&gt;
== Client Roundtrips ==&lt;br /&gt;
The MIT Kerberos client will likely require some core modification to handle the number of roundtrips required by this protocol.&lt;br /&gt;
&lt;br /&gt;
== KDC State ==&lt;br /&gt;
The KDC is generally stateless. Some mechanism will be needed to carry state across the roundtrips. Using PA-FX-COOKIE is probably the simplist. However, this will also likely break forward secrecy. Careful thought will be required for the implementation.&lt;br /&gt;
&lt;br /&gt;
= Proposed ASN.1 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KerberosPAKE DEFINITIONS EXPLICIT TAGS ::= BEGIN&lt;br /&gt;
&lt;br /&gt;
IMPORTS&lt;br /&gt;
    EncryptedData, Int32&lt;br /&gt;
        FROM KerberosV5Spec2 {&lt;br /&gt;
            iso(1) identified-organization(3)&lt;br /&gt;
            dod(6) internet(1) security(5) kerberosV5(2)&lt;br /&gt;
            modules(4) krb5spec2(2)&lt;br /&gt;
        }; -- as defined in RFC 4120.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Preauthentication Data&lt;br /&gt;
--&lt;br /&gt;
PA-PAKE ::= 150&lt;br /&gt;
&lt;br /&gt;
PAKEPreauthenticationData ::= CHOICE {&lt;br /&gt;
  PAKESupport,&lt;br /&gt;
  PAKEStart,&lt;br /&gt;
  PAKEMessage,&lt;br /&gt;
  PAKEFinish,&lt;br /&gt;
  PAKESecondFactor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Key Exchange&lt;br /&gt;
--&lt;br /&gt;
PAKEProfile ::= ENUMERATED {&lt;br /&gt;
  jpake-p256-schnorr-sha256 (0)&lt;br /&gt;
  jpake-p521-schnorr-sha256 (1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESupport ::= [APPLICATION 1] SEQUENCE OF PAKEProfile&lt;br /&gt;
&lt;br /&gt;
PAKEStart ::= [APPLICATION 2] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  2fa     [1] 2FInfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEMessage ::= [APPLICATION 3] SEQUENCE {&lt;br /&gt;
  profile [0] PAKEProfile,&lt;br /&gt;
  message [1] OCTET STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKEFinish ::= [APPLICATION 4] SEQUENCE {&lt;br /&gt;
  message [0] PAKEMessage,&lt;br /&gt;
  keyconf [1] OCTET STRING,&lt;br /&gt;
  2fa     [2] PAKESecondFactor OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PAKESecondFactor ::= [APPLICATION 5] SEQUENCE {&lt;br /&gt;
  type    [0] 2FType,&lt;br /&gt;
  message [1] EncryptedData&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- Second Factor&lt;br /&gt;
--&lt;br /&gt;
2FType ::= ENUMERATED {&lt;br /&gt;
  oath (0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FSupport ::= SEQUENCE {&lt;br /&gt;
  type      [0] PAKE2FType,&lt;br /&gt;
  challenge [1] OCTET STRING OPTIONAL -- Encoded, type-specific&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
2FInfo ::= SEQUENCE {&lt;br /&gt;
  etype     [0] Int32,   -- The etype used to encrypt the 2F&lt;br /&gt;
  required  [1] BOOLEAN, -- If required is TRUE, there MUST be one supported 2F&lt;br /&gt;
  supported [2] SEQUENCE OF 2FSupport OPTIONAL&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--- JPAKE&lt;br /&gt;
--&lt;br /&gt;
SchnorrVerifiedKey ::= SEQUENCE {&lt;br /&gt;
  key [0] BIT STRING,&lt;br /&gt;
  gx  [1] BIT STRING,&lt;br /&gt;
  r   [2] BIT STRING&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKEFirstPass ::= [CONTEXT 1] SEQUENCE {&lt;br /&gt;
  x [1] SchnorrVerifiedKey,&lt;br /&gt;
  y [1] SchnorrVerifiedKey&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
JPAKESecondPass ::= [CONTEXT 2] SchnorrVerifiedKey&lt;br /&gt;
&lt;br /&gt;
-- A note on how OATH works:&lt;br /&gt;
--   * No challenge is sent.&lt;br /&gt;
--   * The first 2FMessage is 2FOATHCode&lt;br /&gt;
--   * If synchronization is required, the second 2FMessage is 2FOATHSync&lt;br /&gt;
--   * The reply is the next 2FOATHCode&lt;br /&gt;
2FOATHCode ::= IA5String&lt;br /&gt;
2FOATHSync ::= BOOLEAN (TRUE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5143</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5143"/>
				<updated>2013-06-17T18:56:26Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* kdc.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== krb5.conf or kdc.conf ===&lt;br /&gt;
The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || N/A (RoUS mode) or '''secret''' MUST be specified! || /path/to/secret.file&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''otp''' plugin will be enabled for all principals which have the '''otp''' user string set, regardless of its value. Conversely, if the '''otp''' user string is unset, the '''otp''' plugin will be disabled for the principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''otp''' user string on the given principal. If the string is set (i.e. non-NULL), a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5136</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5136"/>
				<updated>2013-06-07T20:11:55Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* kdc.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || N/A (RoUS mode) or '''secret''' MUST be specified! || /path/to/secret.file&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''otp''' plugin will be enabled for all principals which have the '''otp''' user string set, regardless of its value. Conversely, if the '''otp''' user string is unset, the '''otp''' plugin will be disabled for the principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''otp''' user string on the given principal. If the string is set (i.e. non-NULL), a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5094</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5094"/>
				<updated>2013-03-07T20:29:32Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''otp''' plugin will be enabled for all principals which have the '''otp''' user string set, regardless of its value. Conversely, if the '''otp''' user string is unset, the '''otp''' plugin will be disabled for the principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''otp''' user string on the given principal. If the string is set (i.e. non-NULL), a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5044</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5044"/>
				<updated>2013-01-10T20:20:12Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Default Token Type */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5043</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5043"/>
				<updated>2013-01-10T20:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Undo revision 5025 by Npmccallum (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   server = $KDCDIR/DEFAULT.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5042</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5042"/>
				<updated>2013-01-10T20:19:38Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Undo revision 5026 by Npmccallum (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   flags = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Flag Name || Meaning&lt;br /&gt;
 |-&lt;br /&gt;
 | downcase_realm || Convert the realm to lowercase ||&lt;br /&gt;
 |-&lt;br /&gt;
 | strip_realm || Discard the '@' symbol and everything that follows it ||&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.flags || strip_realm || Comma separated list of flags ||&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   flags = downcase_realm&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5026</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5026"/>
				<updated>2013-01-02T19:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   flags = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Flag Name || Meaning&lt;br /&gt;
 |-&lt;br /&gt;
 | downcase_realm || Convert the realm to lowercase ||&lt;br /&gt;
 |-&lt;br /&gt;
 | strip_realm || Discard the '@' symbol and everything that follows it ||&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.flags || strip_realm || Comma separated list of flags ||&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   flags = downcase_realm&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5025</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5025"/>
				<updated>2013-01-02T19:59:27Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Convert strip_realm to flags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   flags = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Flag Name || Meaning&lt;br /&gt;
 |-&lt;br /&gt;
 | downcase_realm || Convert the realm to lowercase ||&lt;br /&gt;
 |-&lt;br /&gt;
 | strip_realm || Discard the '@' symbol and everything that follows it ||&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.flags || strip_realm || Comma separated list of flags ||&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   flags = downcase_realm&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5024</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5024"/>
				<updated>2013-01-02T19:24:53Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Remove custom attributes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   server = $KDCDIR/DEFAULT.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (gethostname())&lt;br /&gt;
* Service-Type (Authenticate-Only)&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5023</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5023"/>
				<updated>2013-01-02T19:05:04Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Update to add the reserved DEFAULT token type configuration name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attribute = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
There is a reserved token type name: '''DEFAULT'''. If no '''DEFAULT''' token type configuration is defined, the following configuration will be used internally:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  DEFAULT = {&lt;br /&gt;
   server = $KDCDIR/DEFAULT.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can override this default token type configuration by defining your own token type configuration with the name of '''DEFAULT'''.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the '''DEFAULT''' token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5013</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5013"/>
				<updated>2012-12-19T18:50:20Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   retries = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attribute = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.retries || 3 || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
Internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5012</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5012"/>
				<updated>2012-12-19T18:23:45Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   timeout = &amp;lt;integer&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attribute = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.timeout || 5 || Integer (seconds)&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || true || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
Internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal, realm stripped per config; overridden by '''username''')&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5011</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5011"/>
				<updated>2012-12-19T18:17:04Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || true || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
Internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5009</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5009"/>
				<updated>2012-12-18T19:24:58Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: strip_realm defaults to true, except for the internal default token type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || true || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
   strip_realm = false&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5008</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5008"/>
				<updated>2012-12-18T19:23:26Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: Remove all optional fields from the challenge/configuration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If the flag is set, a generic PA-OTP-CHALLENGE will be sent to the client (no optional fields will be filled in).&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will look up the RADIUS servers using the '''otp''' user string and kdc.conf configuration. All RADIUS servers will be used for validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;br /&gt;
== OTP Preauth Challenge Optional Fields ==&lt;br /&gt;
According to RFC 6560, there are many optional fields. We currently do not have any plan to fill these in.&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5007</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5007"/>
				<updated>2012-12-15T03:23:38Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-target|1.12}}&lt;br /&gt;
{{project-review|2012-12-21}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algorithm  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algorithm || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' We only permit a single server to be defined because we are assuming that redundancy will be handled via DNS round-robin.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5000</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=5000"/>
				<updated>2012-12-11T18:45:38Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algorithm  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algorithm || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''server''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4999</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4999"/>
				<updated>2012-12-11T18:41:23Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* FIPS compliance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algorithm  = &amp;lt;string&amp;gt;&lt;br /&gt;
   remote = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algorithm || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''remote''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   remote = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
We are not targeting FIPS compliance, but for those who are interested here is the related information:&lt;br /&gt;
* RADIUS is not FIPS compliant due to the use of MD5 in the protocol&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4998</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4998"/>
				<updated>2012-12-11T18:01:17Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Proposal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In addition to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algorithm  = &amp;lt;string&amp;gt;&lt;br /&gt;
   remote = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algorithm || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''remote''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   remote = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4997</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4997"/>
				<updated>2012-12-11T17:53:27Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algorithm  = &amp;lt;string&amp;gt;&lt;br /&gt;
   remote = &amp;lt;string&amp;gt;&lt;br /&gt;
   secret = &amp;lt;string&amp;gt;&lt;br /&gt;
   strip_realm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
   attributes = &amp;lt;name_or_number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algorithm || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.strip_realm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.attribute || no || none || &amp;lt;name&amp;gt;:&amp;lt;value&amp;gt; or &amp;lt;number&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''remote''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   remote = $KDCDIR/otp.socket&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first Access-Accept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4992</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4992"/>
				<updated>2012-12-05T21:59:17Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''remote''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
= Remaining Issues =&lt;br /&gt;
== FIPS compliance ==&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4991</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4991"/>
				<updated>2012-12-05T21:54:57Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
All values are optional except '''secret''' when a non-RoUS '''remote''' is specified.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4990</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4990"/>
				<updated>2012-12-05T21:53:55Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no valid token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more valid token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4989</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4989"/>
				<updated>2012-12-05T21:52:09Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; (RoUS mode) or '''secret''' MUST be specified! || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4988</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4988"/>
				<updated>2012-12-05T21:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/&amp;lt;name&amp;gt;.socket || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR ERROR!* || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
* - If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, '''secret''' MUST be specified or the token type will be skipped as invalid.&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4987</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4987"/>
				<updated>2012-12-05T21:48:58Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/otp.socket OR $KDCDIR/&amp;lt;name&amp;gt;.socket* || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR ERROR!** || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{|&lt;br /&gt;
 |*&lt;br /&gt;
 |If no token types are defined, we'll use a generic name. Otherwise, we use the name of the token type.&lt;br /&gt;
 |-&lt;br /&gt;
 |**&lt;br /&gt;
 |If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, '''secret''' MUST be specified or the token type will be skipped as invalid.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4986</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4986"/>
				<updated>2012-12-05T21:45:05Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/otp.socket OR $KDCDIR/&amp;lt;name&amp;gt;.socket* || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)** || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{|&lt;br /&gt;
 |*&lt;br /&gt;
 |If no token types are defined, we'll use a generic name. Otherwise, we use the name of the token type.&lt;br /&gt;
 |-&lt;br /&gt;
 |**&lt;br /&gt;
 |If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, something like localhost:1812.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
==== FIPS compliance ====&lt;br /&gt;
* RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
* EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
* Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4985</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4985"/>
				<updated>2012-12-05T21:44:32Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/otp.socket OR $KDCDIR/&amp;lt;name&amp;gt;.socket* || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)** || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{|&lt;br /&gt;
 |*&lt;br /&gt;
 |If no token types are defined, we'll use a generic name. Otherwise, we use the name of the token type.&lt;br /&gt;
 |-&lt;br /&gt;
 |**&lt;br /&gt;
 |If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, something like localhost:1812.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* FIPS compliance:&lt;br /&gt;
** RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
** EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
** Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4984</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4984"/>
				<updated>2012-12-05T21:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/otp.socket OR $KDCDIR/&amp;lt;name&amp;gt;.socket* || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)** || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{|&lt;br /&gt;
 |*&lt;br /&gt;
 |If no token types are defined, we'll use a generic name. Otherwise, we use the name of the token type.&lt;br /&gt;
 |-&lt;br /&gt;
 |**&lt;br /&gt;
 |If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, something like localhost:1812.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== OTP Enablement ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* FIPS compliance&lt;br /&gt;
 * RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
 * EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
 * Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4983</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4983"/>
				<updated>2012-12-05T21:42:46Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''. In additional to standard RADIUS, the '''otp''' plugin will support a non-standard RADIUS over Unix Socket (RoUS; inconceivable!) mode for handling local companion daemons.&lt;br /&gt;
&lt;br /&gt;
== Token Type Configuration ==&lt;br /&gt;
=== kdc.conf ===&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    stripRealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
 ! Name || Sent to Client || Default Value || Format&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.vendor || yes || not sent || UTF8 String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.length || yes || not sent || Integer&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.format || yes || not sent || Enumeration: decimal, hexadecimal, alphanumeric, binary or base64&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.algID || yes || not sent || UTF8 URI&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.remote || no || $KDCDIR/otp.socket OR $KDCDIR/&amp;lt;name&amp;gt;.socket* || host, host:port or /path/to/unix.socket&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.secret || no || &amp;quot;&amp;quot; OR localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)** || String&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.stripRealm || no || false || Boolean&lt;br /&gt;
 |-&lt;br /&gt;
 | otp.&amp;lt;name&amp;gt;.server.attributes || no || no additional attributes sent || &amp;lt;attrName&amp;gt; = &amp;lt;attrValue&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{|&lt;br /&gt;
 |*&lt;br /&gt;
 |If no token types are defined, we'll use a generic name. Otherwise, we use the name of the token type.&lt;br /&gt;
 |-&lt;br /&gt;
 |**&lt;br /&gt;
 |If '''remote''' indicates RoUS mode, an empty string is default. Otherwise, something like localhost:1812.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Default Token Type ===&lt;br /&gt;
If no token types are defined in the configuration, internally '''otp''' will define a default token type like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;NO NAME&amp;gt; = {&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = $KDCDIR/otp.socket&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, if one or more token types are defined in the configuration, the first valid configuration defined will be considered the default token type.&lt;br /&gt;
&lt;br /&gt;
== Token Instance Configuration ==&lt;br /&gt;
&lt;br /&gt;
Some portion of the '''otp''' plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following JSON formatted array of token objects:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If '''type''' is not specified then it refers to the default token type as defined above. The '''id''' field identifies the unique id of the token and is sent in the PA-OTP-CHALLENGE. The '''username''' field overrides the default User-Name attribute sent in the RADIUS packet.&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If the user string is not set (i.e. NULL) or is an empty string or is an empty list, then a user string of &amp;quot;[{}]&amp;quot; will be assumed.&lt;br /&gt;
&lt;br /&gt;
== Flag ==&lt;br /&gt;
The '''REQUIRES_HW_AUTH''' flag will indicate whether or not the '''otp''' plugin is enabled for a principal.&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), the '''otp''' plugin will look up the '''REQUIRES_HW_AUTH''' flag on the given principal. If not set, no PA-OTP-CHALLENGE will be generated. Otherwise we will look up the '''otp''' user string and a PA-OTP-CHALLENGE will be generated and sent to the client.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a token type using the '''otp''' user string and kdc.conf configuration. All matches will then be used as configuration for RADIUS validation, in the order they were specified in the '''otp''' user string, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by the '''attributes''' section of the config except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* FIPS compliance&lt;br /&gt;
 * RADIUS is not FIPS compliant due to MD5&lt;br /&gt;
 * EAP might make RADIUS FIPS compliant and Fedora ships a libeap&lt;br /&gt;
 * Integration of EAP is not planned at this time&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4982</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4982"/>
				<updated>2012-12-04T23:11:29Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Workflow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User String ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If '''type''' is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user string.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string/configuration. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4981</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4981"/>
				<updated>2012-12-04T23:10:29Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* User Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User String ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If '''type''' is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user string.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4980</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4980"/>
				<updated>2012-12-04T23:10:23Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: /* Workflow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User Strings ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If '''type''' is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user string.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4979</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4979"/>
				<updated>2012-12-04T23:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called '''otp'''.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User Strings ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string '''otp''' with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If '''type''' is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user strings.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4978</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4978"/>
				<updated>2012-12-04T23:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called otp.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User Strings ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string ''otp'' with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If ''type'' is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user strings.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	<entry>
		<id>https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4977</id>
		<title>Projects/OTPOverRADIUS</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.kerberos.org/wiki?title=Projects/OTPOverRADIUS&amp;diff=4977"/>
				<updated>2012-12-04T23:07:51Z</updated>
		
		<summary type="html">&lt;p&gt;Npmccallum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
In 1.11 KRB5 gained client side support for OTP Preauth (RFC 6560), but up until now there is no server side support in tree. Red Hat has created an out-of-tree solution ([https://fedorahosted.org/AuthHub AuthHub]), based upon a plugin model. But our experimenting with this approach has demonstrated:&lt;br /&gt;
# Access to vendor SDKs is non-trivial&lt;br /&gt;
# All vendors provide a RADIUS server for OTP validation&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The KDC-side support for OTP should read configuration and forward token validation to an appropriate RADIUS server. This plugin will be called otp.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration should go into kdc.conf as it may contain secrets that shouldn't be world readable. The configuration is defined as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [otp]&lt;br /&gt;
  &amp;lt;name&amp;gt; = {&lt;br /&gt;
   vendor = &amp;lt;string&amp;gt;&lt;br /&gt;
   length = &amp;lt;integer&amp;gt;&lt;br /&gt;
   format = &amp;lt;enum: decimal|hexadecimal|alphanumeric|binary|base64&amp;gt;&lt;br /&gt;
   algID  = &amp;lt;string&amp;gt;&lt;br /&gt;
   server = {&lt;br /&gt;
    remote = &amp;lt;string&amp;gt;&lt;br /&gt;
    secret = &amp;lt;string&amp;gt;&lt;br /&gt;
    striprealm = &amp;lt;boolean&amp;gt;&lt;br /&gt;
    attributes = {&lt;br /&gt;
     &amp;lt;name&amp;gt; = &amp;lt;string&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The follow values are informational only and will be sent to the client only if set in the config.&lt;br /&gt;
* vendor&lt;br /&gt;
* length&lt;br /&gt;
* format&lt;br /&gt;
* algID&lt;br /&gt;
&lt;br /&gt;
Server configuration is a little more complicated. If no token types are defined in the configuration and a user is configured for OTP access (see below), the otp plugin will fall back to a non-standard RADIUS-over-UNIX-Socket (RoUS; inconceivable!): $KDCDIR/otp.socket. If at least one token type is defined, any token type that does not implement the server section will fall back to RoUS, but with the name of the tokenType: $KDCDIR/&amp;lt;name&amp;gt;.socket.&lt;br /&gt;
&lt;br /&gt;
If a server section is defined, it MUST contain the secret field or the token type will be ignored. This is to prevent insecure message passing in non-RoUS mode. All of the other values are optional, with the following defaults:&lt;br /&gt;
* remote: localhost:getservbyname(&amp;quot;radius&amp;quot;, &amp;quot;udp&amp;quot;)&lt;br /&gt;
* striprealm: false&lt;br /&gt;
* attributes: none&lt;br /&gt;
&lt;br /&gt;
The remote field can contain the following formats:&lt;br /&gt;
* host&lt;br /&gt;
* host:port&lt;br /&gt;
* /path/to/unix/socket&lt;br /&gt;
&lt;br /&gt;
=== User Strings ===&lt;br /&gt;
&lt;br /&gt;
Some portion of the otp plugin configuration is user specific. This value will be stored as the user string ``otp`` with the following (JSON) format:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;lt;string&amp;gt;&lt;br /&gt;
  }, ...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All values above are optional. If ``type`` is not specified, the following will occur:&lt;br /&gt;
* If no token types are defined in the config, we fall back to RoUS mode with the default socket.&lt;br /&gt;
* If one or more token type is specified, the first one with valid configuration will be chosen.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
In the first pass (no PA-OTP-REQUEST present), a PA-OTP-CHALLENGE will be generated from the configuration and user strings.&lt;br /&gt;
&lt;br /&gt;
Upon receipt of a PA-OTP-REQUEST, the KDC will attempt to match the PA-OTP-REQUEST with a tokenInfo from the user string. All matching tokenInfo objects will then be used as configuration for RADIUS validation, in the order they were specified, stopping after the first AccessAccept response is received.&lt;br /&gt;
&lt;br /&gt;
=== RADIUS Packet ===&lt;br /&gt;
The packet sent to the configured RADIUS server will contain:&lt;br /&gt;
* User-Name (default: user principal; realm stripped per config)&lt;br /&gt;
* User-Password (otp-value from PA-OTP-REQUEST)&lt;br /&gt;
* NAS-Identifier (default: gethostname())&lt;br /&gt;
* Service-Type (default: Authenticate-Only)&lt;br /&gt;
* Any custom attributes defined&lt;br /&gt;
&lt;br /&gt;
Any of the attributes specified above may be overridden by custom attribute except User-Name and User-Password.&lt;br /&gt;
&lt;br /&gt;
=== Remaining Issues ===&lt;br /&gt;
* Should we use a RADIUS library or hand-craft packets? We should use a RADIUS library which provides support for EAP methods. Unfortunately no such libraries exist.&lt;br /&gt;
* This architecture is not FIPS compliant due to RADIUS' use of MD5&lt;/div&gt;</summary>
		<author><name>Npmccallum</name></author>	</entry>

	</feed>