lib/gssapi/krb5: split out a arcfour_mic_cksum_iov() function
[heimdal.git] / doc / standardisation / draft-ietf-cat-kerberos-pk-init-22.txt
blob7f9fe5df65e45ca9855d61a304706a8a2680a9d1
1 INTERNET-DRAFT                                                Brian Tung
2 draft-ietf-cat-kerberos-pk-init-22.txt                   Clifford Neuman
3 expires May 15, 2005                                             USC/ISI
4                                                          Sasha Medvinsky
5                                                           Motorola, Inc.
6                                                                Larry Zhu
7                                                                Microsoft
10     Public Key Cryptography for Initial Authentication in Kerberos
13 0.  Status Of This Memo
15 By submitting this Internet-Draft, I certify that any applicable
16 patent or other IPR claims of which I am aware have been disclosed,
17 or will be disclosed, and any of which I become aware will be
18 disclosed, in accordance with RFC 3668.
20 Internet-Drafts are working documents of the Internet Engineering
21 Task Force (IETF), its areas, and its working groups.  Note that
22 other groups may also distribute working documents as
23 Internet-Drafts.
25 Internet-Drafts are draft documents valid for a maximum of six
26 months and may be updated, replaced, or obsoleted by other documents
27 at any time.  It is inappropriate to use Internet-Drafts as
28 reference material or to cite them other than as "work in progress."
30 The list of current Internet-Drafts can be accessed at
31 http://www.ietf.org/ietf/1id-abstracts.txt
33 The list of Internet-Draft Shadow Directories can be accessed at
34 http://www.ietf.org/shadow.html
36 The distribution of this memo is unlimited.  It is filed as
37 draft-ietf-cat-kerberos-pk-init-22.txt and expires May 15, 2005.
38 Please send comments to the authors.
41 1.  Abstract
43 This document describes protocol extensions (hereafter called
44 PKINIT) to the Kerberos protocol specification [1].  These
45 extensions provide a method for integrating public key cryptography
46 into the initial authentication exchange, by passing digital
47 certificates and associated authenticators in preauthentication data
48 fields.
51 2.  Introduction
53 A client typically authenticates itself to a service in Kerberos
54 using three distinct though related exchanges.  First, the client
55 requests a ticket-granting ticket (TGT) from the Kerberos
56 authentication server (AS).  Then, it uses the TGT to request a
57 service ticket from the Kerberos ticket-granting server (TGS).
58 Usually, the AS and TGS are integrated in a single device known as
59 a Kerberos Key Distribution Center, or KDC.  (In this document, we
60 will refer to both the AS and the TGS as the KDC.)  Finally, the
61 client uses the service ticket to authenticate itself to the
62 service.
64 The advantage afforded by the TGT is that the client need explicitly
65 request a ticket and expose his credentials only once.  The TGT and
66 its associated session key can then be used for any subsequent
67 requests.  One result of this is that all further authentication is
68 independent of the method by which the initial authentication was
69 performed.  Consequently, initial authentication provides a
70 convenient place to integrate public-key cryptography into Kerberos
71 authentication.
73 As defined, Kerberos authentication exchanges use symmetric-key
74 cryptography, in part for performance.  One cost of using
75 symmetric-key cryptography is that the keys must be shared, so that
76 before a client can authenticate itself, he must already be
77 registered with the KDC.
79 Conversely, public-key cryptography (in conjunction with an
80 established Public Key Infrastructure) permits authentication
81 without prior registration with a KDC.  Adding it to Kerberos allows
82 the widespread use of Kerberized applications by clients without
83 requiring them to register first with a KDC--a requirement that has
84 no inherent security benefit.
86 As noted above, a convenient and efficient place to introduce
87 public-key cryptography into Kerberos is in the initial
88 authentication exchange.  This document describes the methods and
89 data formats for integrating public-key cryptography into Kerberos
90 initial authentication.
93 3.  Extensions
95 This section describes extensions to [1] for supporting the use of
96 public-key cryptography in the initial request for a ticket.
98 Briefly, this document defines the following extensions to [1]:
100     1.  The client indicates the use of public-key authentication by
101         including a special preauthenticator in the initial request.
102         This preauthenticator contains the client's public-key data
103         and a signature.
105     2.  The KDC tests the client's request against its policy and
106         trusted Certification Authorities (CAs).
108     3.  If the request passes the verification tests, the KDC
109         replies as usual, but the reply is encrypted using either:
111         a.  a symmetric encryption key, signed using the KDC's
112             signature key and encrypted using the client's encryption
113             key; or
115         b.  a key generated through a Diffie-Hellman exchange with
116             the client, signed using the KDC's signature key.
118         Any keying material required by the client to obtain the
119         Encryption key is returned in a preauthentication field
120         accompanying the usual reply.
122     4.  The client obtains the encryption key, decrypts the reply,
123         and then proceeds as usual.
125 Section 3.1 of this document defines the necessary message formats.
126 Section 3.2 describes their syntax and use in greater detail.
129 3.1.  Definitions, Requirements, and Constants
132 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
133 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
134 document are to be interpreted as described in RFC 2119 [12].
137 3.1.1.  Required Algorithms
139 All PKINIT implementations MUST support the following algorithms:
141     - Reply key (or DH-derived key): AES256-CTS-HMAC-SHA1-96 etype.
143     - Signature algorithm: SHA-1 digest and RSA.
145     - Reply key delivery method: ephemeral-ephemeral Diffie-Hellman
146       with a non-zero nonce.
148     - Unkeyed checksum type for the paChecksum member of
149       PKAuthenticator: SHA1 (unkeyed), Kerberos checksum type 14
150       [11].
153 3.1.2.  Defined Message and Encryption Types
155 PKINIT makes use of the following new preauthentication types:
157     PA-PK-AS-REQ                             TBD
158     PA-PK-AS-REP                             TBD
159     PA-PK-AS-ERR                             TBD
161 PKINIT also makes use of the following new authorization data type:
163     AD-INITIAL-VERIFIED-CAS                  TBD
165 PKINIT introduces the following new error codes:
167     KDC_ERR_CLIENT_NOT_TRUSTED                62
168     KDC_ERR_KDC_NOT_TRUSTED                   63
169     KDC_ERR_INVALID_SIG                       64
170     KDC_ERR_KEY_SIZE                          65
171     KDC_ERR_CERTIFICATE_MISMATCH              66
172     KDC_ERR_CANT_VERIFY_CERTIFICATE           70
173     KDC_ERR_INVALID_CERTIFICATE               71
174     KDC_ERR_REVOKED_CERTIFICATE               72
175     KDC_ERR_REVOCATION_STATUS_UNKNOWN         73
176     KDC_ERR_CLIENT_NAME_MISMATCH              75
178 PKINIT uses the following typed data types for errors:
180     TD-DH-PARAMETERS                         TBD
181     TD-TRUSTED-CERTIFIERS                    104
182     TD-CERTIFICATE-INDEX                     105
183     TD-UNKEYED-CHECKSUM-INFO                 109
185 PKINIT defines the following encryption types, for use in the AS-REQ
186 message (to indicate acceptance of the corresponding encryption OIDs
187 in PKINIT):
189     dsaWithSHA1-CmsOID                         9
190     md5WithRSAEncryption-CmsOID               10
191     sha1WithRSAEncryption-CmsOID              11
192     rc2CBC-EnvOID                             12
193     rsaEncryption-EnvOID   (PKCS1 v1.5)       13
194     rsaES-OAEP-EnvOID      (PKCS1 v2.0)       14
195     des-ede3-cbc-EnvOID                       15
197 The above encryption types are used by the client only within the
198 KDC-REQ-BODY to indicate which CMS [14] algorithms it supports.  Their
199 use within Kerberos EncryptedData structures is not specified by this
200 document.
202 The ASN.1 module for all structures defined in this document (plus
203 IMPORT statements for all imported structures) are given in Appendix
204 A.  In the event of a discrepancy between Appendix A and the portions
205 of ASN.1 in the main text, the appendix is normative.
207 All structures defined in this document MUST be encoded using
208 Distinguished Encoding Rules (DER).  All imported data structures
209 must be encoded according to the rules specified in Kerberos [1] or
210 CMS [2] as appropriate.
212 Interoperability note: Some implementations may not be able to
213 decode CMS objects encoded with BER but not DER; specifically, they
214 may not be able to decode infinite length encodings.  To maximize
215 interoperability, implementers SHOULD encode CMS objects used in
216 PKINIT with DER.
219 3.1.3.  Algorithm Identifiers
221 PKINIT does not define, but does make use of, the following
222 algorithm identifiers.
224 PKINIT uses the following algorithm identifier for Diffie-Hellman
225 key agreement [9]:
227     dhpublicnumber
229 PKINIT uses the following signature algorithm identifiers [8, 12]:
231     sha-1WithRSAEncryption (RSA with SHA1)
232     md5WithRSAEncryption   (RSA with MD5)
233     id-dsa-with-sha1       (DSA with SHA1)
235 PKINIT uses the following encryption algorithm identifiers [5] for
236 encrypting the temporary key with a public key:
238     rsaEncryption          (PKCS1 v1.5)
239     id-RSAES-OAEP          (PKCS1 v2.0)
241 PKINIT uses the following algorithm identifiers [14, 8] for
242 encrypting the reply key with the temporary key:
244     des-ede3-cbc           (three-key 3DES, CBC mode)
245     rc2-cbc                (RC2, CBC mode)
246     id-aes256-CBC          (AES-256, CBC mode)
249 3.2.  PKINIT Preauthentication Syntax and Use
251 This section defines the syntax and use of the various
252 preauthentication fields employed by PKINIT.
255 3.2.1.  Client Request
257 The initial authentication request (AS-REQ) is sent as per [1]; in
258 addition, a preauthentication field contains data signed by the
259 client's private signature key, as follows:
261     WrapContentInfo ::= OCTET STRING (CONSTRAINED BY {
262                                     -- Contains a BER encoding of
263                                     -- ContentInfo
264     })
266     WrapIssuerAndSerial ::= OCTET STRING (CONSTRAINED BY {
267                                     -- Contains a BER encoding of
268                                     -- IssuerAndSerialNumber
269     })
271     PA-PK-AS-REQ ::= SEQUENCE {
272         signedAuthPack          [0] IMPLICIT WrapContentInfo,
273                                     -- Type is SignedData.
274                                     -- Content is AuthPack
275                                     -- (defined below).
276         trustedCertifiers       [1] SEQUENCE OF TrustedCA OPTIONAL,
277                                     -- A list of CAs, trusted by
278                                     -- the client, used to certify
279                                     -- KDCs.
280         kdcCert                 [2] IMPLICIT WrapIssuerAndSerial
281                                     OPTIONAL,
282                                     -- Identifies a particular KDC
283                                     -- certificate, if the client
284                                     -- already has it.
285         ...
286     }
288     TrustedCA ::= CHOICE {
289         caName                  [1] Name,
290                                     -- Fully qualified X.500 name
291                                     -- as defined in RFC 3280 [4].
292         issuerAndSerial         [2] IMPLICIT WrapIssuerAndSerial,
293                                     -- Identifies a specific CA
294                                     -- certificate.
295         ...
296     }
298     AuthPack ::= SEQUENCE {
299         pkAuthenticator         [0] PKAuthenticator,
300         clientPublicValue       [1] SubjectPublicKeyInfo OPTIONAL,
301                                     -- Defined in RFC 3280 [4].
302                                     -- Present only if the client
303                                     -- is using ephemeral-ephemeral
304                                     -- Diffie-Hellman.
305         supportedCMSTypes       [2] SEQUENCE OF AlgorithmIdentifier
306                                     OPTIONAL,
307                                     -- List of CMS encryption types
308                                     -- supported by client in order
309                                     -- of (decreasing) preference.
310         ...
311     }
313     PKAuthenticator ::= SEQUENCE {
314         cusec                   [0] INTEGER (0..999999),
315         ctime                   [1] KerberosTime,
316                                     -- cusec and ctime are used as
317                                     -- in [1], for replay
318                                     -- prevention.
319         nonce                   [2] INTEGER (0..4294967295),
320                                     -- Binds reply to request,
321                                     -- MUST be zero when client
322                                     -- will accept cached
323                                     -- Diffie-Hellman parameters
324                                     -- from KDC. MUST NOT be
325                                     -- zero otherwise.
326         paChecksum              [3] OCTET STRING OPTIONAL,
327                                     -- Defined in [1].
328                                     -- Performed over KDC-REQ-BODY,
329                                     -- MUST be unkeyed.
330         ...
331     }
333 The ContentInfo in the signedAuthPack is filled out as follows:
335     1.  The eContent field MUST contain data of type AuthPack.
336         The supportedCMSTypes field is filled with the algorithm
337         identifiers that the client supports, in order of
338         preference, with most preferred first.
340     2.  The eContentType field MUST contain the OID value for
341         id-pkauthdata: { iso(1) org(3) dod(6) internet(1)
342         security(5) kerberosv5(2) pkinit(3) pkauthdata(1)}
344     3.  The signerInfos field MUST contain the signature over the
345         AuthPack.
347     4.  The certificates field MUST contain at least a signature
348         verification certificate chain that the KDC can use to
349         verify the signature over the AuthPack.  The certificate
350         chain(s) MUST NOT contain the root CA certificate.
352     5.  If a Diffie-Hellman key is being used, the parameters MUST
353         be chosen from Oakley Group 2 or 14.  Implementations MUST
354         support Group 2; they are RECOMMENDED to support Group 14.
355         (See RFC 2409 [10] and RFC 3526 [13].)
357     6.  The KDC may wish to use cached Diffie-Hellman parameters.
358         To indicate acceptance of caching, the client sends zero in
359         the nonce field of the pkAuthenticator.  Zero is not a valid
360         value for this field under any other circumstances.  Since
361         zero is used to indicate acceptance of cached parameters,
362         message binding in this case is performed using only the
363         nonce in the main request.
366 3.2.2.  Validation of Client Request
368 Upon receiving the client's request, the KDC validates it.  This
369 section describes the steps that the KDC MUST (unless otherwise
370 noted) take in validating the request.
372 The KDC must look for a client certificate in the signedAuthPack.
373 If it cannot find one signed by a CA it trusts, it sends back an
374 error of type KDC_ERR_CANT_VERIFY_CERTIFICATE.  The accompanying
375 e-data for this error is a TYPED-DATA (as defined in [1]).  For this
376 error, the data-type is TD-TRUSTED-CERTIFIERS, and the data-value is
377 the DER encoding of
379     KDCTrustedCertifiers ::= SEQUENCE OF Name
381 If, while verifying the certificate chain, the KDC determines that
382 the signature on one of the certificates in the signedAuthPack is
383 invalid, it returns an error of type KDC_ERR_INVALID_CERTIFICATE.
384 The accompanying e-data for this error is a TYPED-DATA, whose
385 data-type is TD-CERTIFICATE-INDEX, and whose data-value is the DER
386 encoding of the index into the CertificateSet field, ordered as sent
387 by the client:
389     CertificateIndex ::= IssuerAndSerialNumber
390                                     -- IssuerAndSerialNumber of
391                                     -- certificate with invalid signature
393 If more than one certificate signature is invalid, the KDC MAY send
394 one TYPED-DATA per invalid signature.
396 The KDC MAY also check whether any certificates in the client's
397 chain have been revoked.  If any of them have been revoked, the KDC
398 MUST return an error of type KDC_ERR_REVOKED_CERTIFICATE; if the KDC
399 attempts to determine the revocation status but is unable to do so,
400 it SHOULD return an error of type KDC_ERR_REVOCATION_STATUS_UNKNOWN.
401 The certificate or certificates affected are identified exactly as
402 for an error of type KDC_ERR_INVALID_CERTIFICATE (see above).
404 In addition to validating the certificate chain, the KDC MUST also
405 check that the certificate properly maps to the client's principal name
406 as specified in the AS-REQ as follows:
408     1.  If the KDC has its own mapping from the name in the
409         certificate to a Kerberos name, it uses that Kerberos
410         name.
412     2.  Otherwise, if the certificate contains a SubjectAltName
413         extension with a Kerberos name in the otherName field,
414         it uses that name. The otherName field (of type AnotherName)
415         in the SubjectAltName extension MUST contain the following:
417         The type-id is:
419             krb5PrincipalName OBJECT IDENTIFIER ::= {
420                 iso (1) org (3) dod (6) internet (1) security (5)
421                 kerberosv5 (2) 2
422             }
424         The value is:
426             KRB5PrincipalName ::= SEQUENCE {
427                 realm                   [0] Realm,
428                 principalName           [1] PrincipalName
429             }
431 If the KDC does not have its own mapping and there is no Kerberos
432 name present in the certificate, or if the name in the request does
433 not match the name in the certificate (including the realm name), or
434 if there is no name in the request, the KDC MUST return error code
435 KDC_ERR_CLIENT_NAME_MISMATCH.  There is no accompanying e-data
436 for this error.
438 Even if the chain is validated, and the names in the certificate and
439 the request match, the KDC may decide not to trust the client.  For
440 example, the certificate may include an Extended Key Usage (EKU) OID
441 in the extensions field.  As a matter of local policy, the KDC may
442 decide to reject requests on the basis of the absence or presence of
443 specific EKU OIDs.  In this case, the KDC MUST return error code
444 KDC_ERR_CLIENT_NOT_TRUSTED. The PKINIT EKU OID is defined as:
446     { iso(1) org(3) dod(6) internet(1) security(5) kerberosv5(2)
447       pkinit(3) pkekuoid(4) }
449 If the client's signature on the signedAuthPack fails to verify, or
450 if there is no paChecksum field, the KDC MUST return error
451 KDC_ERR_INVALID_SIG.  There is no accompanying e-data for this
452 error.
454 The KDC MUST check the timestamp to ensure that the request is not
455 a replay, and that the time skew falls within acceptable limits.
456 The recommendations clock skew times in [1] apply here.  If the
457 check fails, the KDC MUSTreturn error code KRB_AP_ERR_REPEAT or
458 KRB_AP_ERR_SKEW, respectively.
460 If the clientPublicValue is filled in, indicating that the client
461 wishes to use ephemeral-ephemeral Diffie-Hellman, the KDC checks to
462 see if the parameters satisfy its policy.  If they do not, it MUST
463 return error code KDC_ERR_KEY_SIZE.  The accompanying e-data is a
464 TYPED-DATA, whose data-type is TD-DH-PARAMETERS, and whose
465 data-value is the DER encoding of a DomainParameters (see [3]),
466 including appropriate Diffie-Hellman parameters with which to retry
467 the request.
469 The KDC MUST return error code KDC_ERR_CERTIFICATE_MISMATCH if the
470 client included a kdcCert field in the PA-PK-AS-REQ and the KDC does
471 not have the corresponding certificate.
473 The KDC MUST return error code KDC_ERR_KDC_NOT_TRUSTED if the client
474 did not include a kdcCert field, but did include a trustedCertifiers
475 field, and the KDC does not possesses a certificate issued by one of
476 the listed certifiers.
478 If there is a supportedCMSTypes field in the AuthPack, the KDC must
479 check to see if it supports any of the listed types.  If it supports
480 more than one of the types, the KDC SHOULD use the one listed first.
481 If it does not support any of them, it MUST return an error of type
482 KRB5KDC_ERR_ETYPE_NOSUPP.
485 3.2.3.  KDC Reply
487 Assuming that the client's request has been properly validated, the
488 KDC proceeds as per [1], except as follows.
490 The KDC MUST set the initial flag and include an authorization data
491 of type AD-INITIAL-VERIFIED-CAS in the issued ticket.  The value is
492 an OCTET STRING containing the DER encoding of InitialVerifiedCAs:
494     InitialVerifiedCAs ::= SEQUENCE OF SEQUENCE {
495         ca                      [0] Name,
496         Validated               [1] BOOLEAN,
497         ...
498     }
500 The KDC MAY wrap any AD-INITIAL-VERIFIED-CAS data in AD-IF-RELEVANT
501 containers if the list of CAs satisfies the KDC's realm's policy.
502 (This corresponds to the TRANSITED-POLICY-CHECKED ticket flag.)
503 Furthermore, any TGS must copy such authorization data from tickets
504 used in a PA-TGS-REQ of the TGS-REQ to the resulting ticket,
505 including the AD-IF-RELEVANT container, if present.
507 Application servers that understand this authorization data type
508 SHOULD apply local policy to determine whether a given ticket
509 bearing such a type *not* contained within an AD-IF-RELEVANT
510 container is acceptable.  (This corresponds to the AP server
511 checking the transited field when the TRANSITED-POLICY-CHECKED flag
512 has not been set.)  If such a data type is contained within an
513 AD-IF-RELEVANT container, AP servers MAY apply local policy to
514 determine whether the authorization data is acceptable.
516 The AS-REP is otherwise unchanged from [1].  The KDC encrypts the
517 reply as usual, but not with the client's long-term key.  Instead,
518 it encrypts it with either a generated encryption key, or a key
519 derived from a Diffie-Hellman exchange. The contents of the
520 PA-PK-AS-REP indicate the type of encryption key that was used:
522     PA-PK-AS-REP ::= CHOICE {
523         dhSignedData            [0] IMPLICIT WrapContentInfo,
524                                     -- Type is SignedData.
525                                     -- Content is KDCDHKeyInfo
526                                     -- (defined below).
527         encKeyPack              [1] IMPLICIT WrapContentInfo,
528                                     -- Type is EnvelopedData.
529                                     -- Encrypted using client's
530                                     -- public key certificate.
531                                     -- Content is SignedData over
532                                     -- ReplyKeyPack (defined below).
533         ...
534     }
536     KDCDHKeyInfo ::= SEQUENCE {
537         subjectPublicKey        [0] BIT STRING,
538                                     -- Equals public exponent
539                                     -- (g^a mod p).
540                                     -- INTEGER encoded as payload
541                                     -- of BIT STRING.
542         nonce                   [1] INTEGER (0..4294967295),
543                                     -- Binds reply to request.
544                                     -- Exception: A value of zero
545                                     -- indicates that the KDC is
546                                     -- using cached values.
547         dhKeyExpiration         [2] KerberosTime OPTIONAL,
548                                     -- Expiration time for KDC's
549                                     -- cached values.
550         ...
551     }
553 The fields of the ContentInfo for dhSignedData are to be filled in
554 as follows:
556     1.  The eContent field contains data of type KDCDHKeyInfo.
558     2.  The eContentType field contains the OID value for
559         id-pkdhkeydata: { iso(1) org(3) dod(6) internet(1)
560         security(5) kerberosv5(2) pkinit(3) pkdhkeydata(2) }
562     3.  The signerInfos field contains a single signerInfo, which is
563         the signature of the KDCDHKeyInfo.
565     4.  The certificates field contains a signature verification
566         certificate chain that the client will use to verify the
567         KDC's signature over the KDCDHKeyInfo.  This field may only
568         be left empty if the client did include a kdcCert field in
569         the PA-PK-AS-REQ, indicating that it has the KDC's
570         certificate.  The certificate chain MUST NOT contain the
571         root CA certificate.
573     5.  If the client and KDC agree to use cached parameters, the
574         KDC MUST return a zero in the nonce field and include the
575         expiration time of the cached values in the dhKeyExpiration
576         field.  If this time is exceeded, the client MUST NOT use
577         the reply.  If the time is absent, the client MUST NOT use
578         the reply and MAY resubmit a request with a non-zero nonce,
579         thus indicating non-acceptance of the cached parameters.
581 The KDC reply key is derived as follows:
583     1.  Both the KDC and the client calculate the shared secret
584         value
586             DHKey = g^(ab) mod p
588         where a and b are the client's and KDC's private exponents,
589         respectively.  DHKey, padded first with leading zeros as
590         needed to make it as long as the modulus p, is represented
591         as a string of octets in big-endian order (such that the
592         size of DHKey in octets is the size of the modulus p).
594     2.  Let K be the key-generation seed length [6] of the reply key
595         whose enctype is selected according to [1].
597     3.  Define the function octetstring2key() as follows:
599             octetstring2key(x) == random-to-key(K-truncate(
600                                          sha1(0x00 | x) |
601                                          sha1(0x01 | x) |
602                                          sha1(0x02 | x) |
603                                          ...
604                                      ))
606         where x is an octet string; | is the concatenation operator;
607         0x00, 0x01, 0x02, etc. are each represented as a single
608         octet; random-to-key() is an operation that generates a
609         protocolkey from a bitstring of length K; and K-truncate
610         truncates its input to K bits.  Both K and random-to-key()
611         are defined in the kcrypto profile [6] for the enctype of
612         the reply key.
614     4.  When cached DH parameters are used, let n_c be the
615         clientDHNonce, and n_k be the serverDHNonce; otherwise, let
616         both n_c and n_k be empty octet strings.  The reply key k is
618             k = octetstring2key(DHKey | n_c | n_k)
620 If the KDC and client are not using Diffie-Hellman, the KDC encrypts
621 the reply with an encryption key, packed in the encKeyPack, which
622 contains data of type ReplyKeyPack:
624     ReplyKeyPack ::= SEQUENCE {
625         replyKey                [0] EncryptionKey,
626                                     -- Defined in [1].
627                                     -- Used to encrypt main reply.
628                                     -- MUST be at least as strong
629                                     -- as session key.  (Using the
630                                     -- same enctype and a strong
631                                     -- prng should suffice, if no
632                                     -- stronger encryption system
633                                     -- is available.)
634         nonce                   [1] INTEGER (0..4294967295),
635                                     -- Binds reply to request.
636         ...
637     }
639 The fields of the ContentInfo for encKeyPack MUST be filled in as
640 follows:
642     1.  The content is of type SignedData.  The eContent for
643         the SignedData is of type ReplyKeyPack.
645     2.  The eContentType for the SignedData contains the OID value
646         for id-pkrkeydata: { iso(1) org(3) dod(6) internet(1)
647         security(5) kerberosv5(2) pkinit(3) pkrkeydata(3) }
649     3.  The signerInfos field contains a single signerInfo, which is
650         the signature of the ReplyKeyPack.
652     4.  The certificates field contains a signature verification
653         certificate chain that the client will use to verify the
654         KDC's signature over the ReplyKeyPack.  This field may only
655         be left empty if the client included a kdcCert field in the
656         PA-PK-AS-REQ, indicating that it has the KDC's certificate.
657         The certificate chain MUST NOT contain the root CA
658         certificate.
660     5.  The contentType for the EnvelopedData contains the OID value
661         for id-signedData: { iso (1) member-body (2) us (840) rsadsi
662         (113549) pkcs (1) pkcs7 (7) signedData (2) }
664     6.  The enveloped data MUST contain one KeyTransRecipientInfo,
665         which is targeted to the client's certificate (obtained in
666         the initial request).
668     7.  The unprotectedAttrs or originatorInfo fields MAY be
669         present.
672 3.2.4.  Validation of KDC Reply
674 Upon receipt of the KDC's reply, the client proceeds as follows.  If
675 the PA-PK-AS-REP contains a dhSignedData, the client obtains and
676 verifies the Diffie-Hellman parameters, and obtains the shared key
677 as described above.  Otherwise, the message contains an encKeyPack,
678 and the client decrypts and verifies the temporary encryption key.
680 In either case, the client MUST check to see if the included
681 certificate contains a subjectAltName extension of type dNSName or
682 iPAddress (if the KDC is specified by IP address instead of name).
683 If it does, it MUST check to see if that extension matches the KDC
684 it believes it is communicating with, with matching rules specified
685 in RFC 2459.  Exception: If the client has some external information
686 as to the identity of the KDC, this check MAY be omitted.
688 The client also MUST check that the KDC's certificate contains an
689 extendedKeyUsage OID of id-pkkdcekuoid:
691     { iso(1) org(3) dod(6) internet(1) security(5) kerberosv5(2)
692       pkinit(3) pkkdcekuoid(5) }
694 If all applicable checks are satisfied, the client then decrypts the
695 main reply with the resulting key, and then proceeds as described in
696 [1].
699 3.2.5.  Indicating PKINIT Support
701 A KDC that supports PKINIT SHOULD indicate support for PKINIT to
702 clients that did not include any or acceptable pre-authentication in
703 their AS requests.  As per [1], KDCs respond to such requests with a
704 KRB-ERROR with KDC_ERR_PREAUTH_REQUIRED as the error code and with a
705 list of pre-authentication data in the KRB-ERROR's e-data field.
707 To indicate support for PKINIT, then, a KDC MUST include, in
708 KDC_ERR_PREAUTH_REQUIRED KRB-ERROR messages, a padata element of
709 type PA-PK-AS-ERR.  The padata-value field of this padata element
710 MUST be set to the zero-length string; clients MUST ignore this and
711 any other value.
713 A client that receives a KRB-ERROR message, bearing a PA-PK-AS-ERR
714 padata element, from a KDC in response to its AS-REQ should take the
715 message as an indication of support by the KDC for PKINIT.  The
716 client MAY respond by attempting a new AS exchange using its
717 preferred pre-authentication mechanism for which the KDC has
718 indicated support in its error message and for which the client has
719 credentials, possibly including PKINIT.
721 Future extensions to PKINIT may provide for the use of the value of
722 PA-PK-AS-ERR padata elements to indicate such details as KDCs' PKI
723 trust anchors, negotiation preferences, etc.
726 4.  Security Considerations
728 PKINIT raises certain security considerations beyond those that can
729 be regulated strictly in protocol definitions.  We will address them
730 in this section.
732 PKINIT extends the cross-realm model to the public-key
733 infrastructure.  Users of PKINIT must understand security policies
734 and procedures appropriate to the use of Public Key Infrastructures.
736 Standard Kerberos allows the possibility of interactions between
737 cryptosystems of varying strengths; this document adds interactions
738 with public-key cryptosystems to Kerberos.  Some administrative
739 policies may allow the use of relatively weak public keys.  Using
740 such keys to wrap data encrypted under stronger conventional
741 cryptosystems may be inappropriate.
743 PKINIT requires keys for symmetric cryptosystems to be generated.
744 Some such systems contain "weak" keys.  For recommendations regarding
745 these weak keys, see [1].
747 PKINIT allows the use of a zero nonce in the PKAuthenticator when
748 cached Diffie-Hellman keys are used.  In this case, message binding
749 is performed using the nonce in the main request in the same way as
750 it is done for ordinary AS-REQs (without the PKINIT
751 pre-authenticator).  The nonce field in the KDC request body is
752 signed through the checksum in the PKAuthenticator, which
753 cryptographically binds the PKINIT pre-authenticator to the main
754 body of the AS Request and also provides message integrity for the
755 full AS Request.
757 However, when a PKINIT pre-authenticator in the AS-REP has a
758 zero-nonce, and an attacker has somehow recorded this
759 pre-authenticator and discovered the corresponding Diffie-Hellman
760 private key (e.g., with a brute-force attack), the attacker will be
761 able to fabricate his own AS-REP messages that impersonate the KDC
762 with this same pre-authenticator.  This compromised pre-authenticator
763 will remain valid as long as its expiration time has not been reached
764 and it is therefore important for clients to check this expiration
765 time and for the expiration time to be reasonably short, which
766 depends on the size of the Diffie-Hellman group.
768 If a client also caches its Diffie-Hellman keys, then the session key
769 could remain the same during multiple AS-REQ/AS-REP exchanges and an
770 attacker which compromised the session key could fabricate his own
771 AS-REP messages with a pre-recorded pre-authenticator until the
772 client starts using a new Diffie-Hellman key pair and while the KDC
773 pre-authenticator has not yet expired.  It is therefore not
774 recommended for KDC clients to also cache their Diffie-Hellman keys.
776 Care should be taken in how certificates are chosen for the purposes
777 of authentication using PKINIT.  Some local policies may require
778 that key escrow be used for certain certificate types.  Deployers of
779 PKINIT should be aware of the implications of using certificates that
780 have escrowed keys for the purposes of authentication.
782 PKINIT does not provide for a "return routability" test to prevent
783 attackers from mounting a denial-of-service attack on the KDC by
784 causing it to perform unnecessary and expensive public-key
785 operations.  Strictly speaking, this is also true of standard
786 Kerberos, although the potential cost is not as great, because
787 standard Kerberos does not make use of public-key cryptography.
789 The syntax for the AD-INITIAL-VERIFIED-CAS authorization data does
790 permit empty SEQUENCEs to be encoded.  Such empty sequences may only
791 be used if the KDC itself vouches for the user's certificate.  [This
792 seems to reflect the consensus of the Kerberos working group.]
795 5.  Acknowledgements
797 The following people have made significant contributions to this
798 draft: Ari Medvinsky, Matt Hur, John Wray, Jonathan Trostle, Nicolas
799 Williams, Tom Yu, Sam Hartman, and Jeff Hutzelman.
801 Some of the ideas on which this document is based arose during
802 discussions over several years between members of the SAAG, the IETF
803 CAT working group, and the PSRG, regarding integration of Kerberos
804 and SPX.  Some ideas have also been drawn from the DASS system.
805 These changes are by no means endorsed by these groups.  This is an
806 attempt to revive some of the goals of those groups, and this
807 document approaches those goals primarily from the Kerberos
808 perspective.  Lastly, comments from groups working on similar ideas
809 in DCE have been invaluable.
812 6.  Expiration Date
814 This draft expires May 15, 2005.
817 7.  Bibliography
819 [1] RFC-Editor: To be replaced by RFC number for
820 draft-ietf-krb-wg-kerberos-clarifications.
822 [2] R. Housley. Cryptographic Message Syntax. August 2002.  Request
823 For Comments 3369.
825 [3] W. Polk, R. Housley, and L. Bassham. Algorithms and Identifiers
826 for the Internet X.509 Public Key Infrastructure Certificate and
827 Certificate Revocation List (CRL) Profile, April 2002. Request For
828 Comments 3279.
830 [4] R. Housley, W. Polk, W. Ford, D. Solo. Internet X.509 Public
831 Key Infrastructure Certificate and Certificate Revocation List
832 (CRL) Profile, April 2002. Request for Comments 3280.
834 [5] B. Kaliski, J. Staddon. PKCS #1: RSA Cryptography
835 Specifications, October 1998.  Request for Comments 2437.
837 [6] RFC-Editor: To be replaced by RFC number for
838 draft-ietf-krb-wg-crypto.
840 [7] S. Blake-Wilson, M. Nystrom, D. Hopwood, J. Mikkelsen, and
841 T. Wright. Transport Layer Security (TLS) Extensions, June 2003.
842 Request for Comments 3546.
844 [8] J. Schaad.  Use of the Advanced Encryption Standard (AES)
845 Encryption Algorithm in Cryptographic Message Syntax (CMS).  July
846 2003.  Request for Comments 3565.
848 [9] NIST, Guidelines for Implementing and Using the NBS Encryption
849 Standard, April 1981.  FIPS PUB 74.
851 [10] D. Harkins and D. Carrel.  The Internet Key Exchange (IKE),
852 November 1998.  Request for Comments 2409.
854 [11] K. Raeburn.  Unkeyed SHA-1 Checksum Specification for Kerberos
855 5.  Internet-Draft, draft-ietf-krb-wg-sha1-00.txt.
857 [12] S. Bradner.  Key Words for Use in RFCs to Indicate Requirement
858 Levels.  March 1997.  Request for Comments 2119 (BCP 14).
860 [13] T. Kivinen, M. Kojo.  More Modular Exponential (MODP) Diffie-
861 Hellman Groups for Internet Key Exchange (IKE).  May 2003.  Request
862 for Comments 3526.
864 [14] R. Housley. Cryptographic Message Syntax (CMS) Algorithms.
865 August 2002.  Request For Comments 3370.
868 8.  Authors
870 Brian Tung
871 Clifford Neuman
872 USC Information Sciences Institute
873 4676 Admiralty Way Suite 1001
874 Marina del Rey CA 90292-6695
875 Phone: +1 310 822 1511
876 E-mail: {brian,bcn}@isi.edu
878 Sasha Medvinsky
879 Motorola, Inc.
880 6450 Sequence Drive
881 San Diego, CA 92121
882 +1 858 404 2367
883 E-mail: smedvinsky@motorola.com
886 Appendix A.  PKINIT ASN.1 Module
888 KerberosV5-PK-INIT-SPEC {
889            iso(1) identified-organization(3) dod(6) internet(1)
890            security(5) kerberosV5(2) modules(4) pkinit(TBD)
891 } DEFINITIONS EXPLICIT TAGS ::= BEGIN
893     IMPORTS
894         SubjectPublicKeyInfo, AlgorithmIdentifier, Name
895             FROM PKIX1Explicit88 { iso (1) identified-organization (3)
896               dod (6) internet (1) security (5) mechanisms (5)
897               pkix (7) id-mod (0) id-pkix1-explicit (18) }
899         ContentInfo, IssuerAndSerialNumber
900             FROM CryptographicMessageSyntax { iso(1) member-body(2)
901               us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16)
902               modules(0) cms(1) }
904         KerberosTime, Checksum, TYPED-DATA, PrincipalName, Realm, EncryptionKey
905             FROM KerberosV5Spec2 { iso(1) identified-organization(3)
906               dod(6) internet(1) security(5) kerberosV5(2) modules(4)
907               krb5spec2(2) } ;
909     id-pkinit  OBJECT IDENTIFIER ::=
910       { iso (1) org (3) dod (6) internet (1) security (5)
911         kerberosv5 (2) pkinit (3) }
913     id-pkdhkeydata  OBJECT IDENTIFIER  ::= { id-pkinit 1 }
914     id-pkdhkeydata  OBJECT IDENTIFIER  ::= { id-pkinit 2 }
915     id-pkrkeydata  OBJECT IDENTIFIER  ::= { id-pkinit 3 }
916     id-pkekuoid  OBJECT IDENTIFIER  ::= { id-pkinit 4 }
917     id-pkkdcekuoid  OBJECT IDENTIFIER  ::= { id-pkinit 5 }
919     pa-pk-as-req INTEGER ::=                 TBD
920     pa-pk-as-rep INTEGER ::=                 TBD
921     pa-pk-ocsp-req INTEGER ::=               TBD
922     pa-pk-ocsp-rep INTEGER ::=               TBD
924     ad-initial-verified-cas INTEGER ::=      TBD
926     td-dh-parameters INTEGER ::=             TBD
927     td-trusted-certifiers INTEGER ::=        104
928     td-certificate-index INTEGER ::=         105
930     WrapContentInfo ::= OCTET STRING (CONSTRAINED BY {
931                                     -- Contains a BER encoding of
932                                     -- ContentInfo
933     })
935     WrapIssuerAndSerial ::= OCTET STRING (CONSTRAINED BY {
936                                     -- Contains a BER encoding of
937                                     -- IssuerAndSerialNumber
938     })
940     PA-PK-AS-REQ ::= SEQUENCE {
941         signedAuthPack          [0] IMPLICIT WrapContentInfo,
942         trustedCertifiers       [1] SEQUENCE OF TrustedCA OPTIONAL,
943         kdcCert                 [2] IMPLICIT WrapIssuerAndSerial
944                                     OPTIONAL,
945         ...
946     }
948     TrustedCA ::= CHOICE {
949         caName                  [1] Name,
950         issuerAndSerial         [2] IMPLICIT WrapIssuerAndSerial,
951         ...
952     }
954     AuthPack ::= SEQUENCE {
955         pkAuthenticator         [0] PKAuthenticator,
956         clientPublicValue       [1] SubjectPublicKeyInfo OPTIONAL,
957         supportedCMSTypes       [2] SEQUENCE OF AlgorithmIdentifier
958                                     OPTIONAL,
959         ...
960     }
962     PKAuthenticator ::= SEQUENCE {
963         cusec                   [0] INTEGER (0..999999),
964         ctime                   [1] KerberosTime,
965         nonce                   [2] INTEGER (0..4294967295),
966         paChecksum              [3] OCTET STRING OPTIONAL,
967         ...
968     }
970     KDCTrustedCertifiers ::= SEQUENCE OF Name
972     CertificateIndex ::= IssuerAndSerialNumber
974     KRB5PrincipalName ::= SEQUENCE {
975         realm                   [0] Realm,
976         principalName           [1] PrincipalName
977     }
979     InitialVerifiedCAs ::= SEQUENCE OF SEQUENCE {
980         ca                      [0] Name,
981         validated               [1] BOOLEAN,
982         ...
983     }
985     PA-PK-AS-REP ::= CHOICE {
986         dhSignedData            [0] IMPLICIT WrapContentInfo,
987         encKeyPack              [1] IMPLICIT WrapContentInfo,
988         ...
989     }
991     KDCDHKeyInfo ::= SEQUENCE {
992         subjectPublicKey        [0] BIT STRING,
993         nonce                   [1] INTEGER (0..4294967295),
994         dhKeyExpiration         [2] KerberosTime OPTIONAL,
995         ...
996     }
998     ReplyKeyPack ::= SEQUENCE {
999         replyKey                [0] EncryptionKey,
1000         nonce                   [1] INTEGER (0..4294967295),
1001         ...
1002     }
1006 Copyright (C) The Internet Society 2004.  This document is subject
1007 to the rights, licenses and restrictions contained in BCP 78, and
1008 except as set forth therein, the authors retain all their rights.
1010 This document and the information contained herein are provided on
1011 an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE
1012 REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE
1013 INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR
1014 IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
1015 THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
1016 WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.