view Side-By-Side changes
INTERNET-DRAFT Clifford Neumandraft-ietf-cat-kerberos-pk-init-01.txtdraft-ietf-cat-kerberos-pk-init-02.txt Brian Tung Updates: RFC 1510 ISI expiresDecember 7, 1996April 19, 1997 John Wray Digital Equipment Corporation Jonathan Trostle CyberSafe Corporation Public Key Cryptography for Initial Authentication in Kerberos 0. Status Of this Memo This document is an Internet-Draft. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other docu- ments at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as ``work in pro- gress.'' To learn the current status of any Internet-Draft, please check the ``1id-abstracts.txt'' listing contained in the Internet-Drafts Sha- dow Directories on ds.internic.net (US East Coast), nic.nordu.net (Europe), ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific Rim). The distribution of this memo is unlimited. It is filed asdraft-ietf-cat-kerberos-pk-init-01.txt,draft-ietf-cat-kerberos-pk-init-02.txt, and expiresDecember 7, 1996.April 19, 1997. Please send comments to the authors. 1. Abstract This document defines extensions to the Kerberos protocolspecifi- cationspecification (RFC 1510, "The Kerberos Network Authentication Service (V5)", September 1993) to provide a method for using public key cryptography during initial authentication. The method defined specifies the way in which preauthentication data fields and error data fields in Kerberos messages are to be used to transport public key data. 2. Motivation Public key cryptography presents a means by which a principal may demonstrate possession of a key, without ever having divulged this key to anyone else. In conventional cryptography, the encryption key and decryption key are either identical or can easily be derived from one another. In public key cryptography, however, neither the public key nor the private key can be derived from the other (although the private key RECORD may include the information required to generate BOTH keys). Hence, a message encrypted with a public key is private, since only the person possessing the private key can decrypt it; similarly, someone possessing the private key can also encrypt a message, thus providing a digital signature. Furthermore, conventional keys are often derived from passwords, so messages encrypted with these keys are susceptible to dictionary attacks, whereas public key pairs are generated from a pseudo-random number sequence. While it is true that messages encrypted using public key cryptography are actually encrypted with a conventional secret key, which is in turn encrypted using the public key pair, the secret key is also randomly generated and is hence not vulnerable to a dictionary attack. The advantages provided by public key cryptography have produced a demand for its integration into the Kerberos authentication protocol. Theprimary advantage of registeringpublic key integration into Kerberos described in this document has three goals. First, by allowing users to register public keys with theKDC lies inKDC, theease of recoveryKDC can be recovered much more easily incasetheKDCevent it is compromised. With Kerberos as it currently stands, compromise of the KDC is disastrous. All keys become known by the attacker and all keys must be changed. Second, we allow users that have public key certificates signed by outside authorities to obtain Kerberos credentials for access to Kerberized services. Third, we obtain the above benefits while maintaining the performance advantages of Kerberos over protocols that use only public key authentication. If users register public keys, compromise of the KDC does not divulge their private key. Compromise of security on the KDC is still a problem, since an attacker can impersonate any user bycertifyingcreating abogus key withticket granting ticket for theKDC's private key. However, all bogus certificates can be invalidated by revoking and changinguser. When theKDC's public key. Legitimate users have to re-certify their public keys withcompromise is detected, thenewKDCkey, but the users's keys themselves do not need tocan bechanged.cleaned up and restored from backup media and loaded with a backup private/public key pair. Keys for application servers are conventional symmetric keys and must be changed. Note: If a user stores his private key, in an encrypted form, on the KDC, thenhe does haveit may be desirable to change the key pair, since the private key is encrypted using a symmetric key derived from a password (as described below), andiscan therefore be vulnerable to dictionaryattack. Assumingattack if a good passwordpolicy, however, legitimate userspolicy is not used. Alternatively, if the encrypting symmetric key has 56 bits, then it may also bealloweddesirable tousechange theold password forkey pair after alimited time, solely for the purpose of changingshort period due to the short keypair.length. Therealm administrator is thenKDC does notforcedhave access tore-key all users.the user's unencrypted private key. There are two important areas where public key cryptography will have immediate use: in the initial authentication of users registered with the KDC or using public key certificates from outside authorities, and to establish inter-realm keys for cross-realm authentication. This memo describes a method by which the first of these can be done. The second case will be the topic for a separate proposal. Some of the ideas on which this proposal is based arose during discussions over several years between members of the SAAG, the IETF-CAT working group, and the PSRG, regarding integration of Kerberos and SPX. Some ideas are drawn from the DASS system, and similar extensions have been discussed for use in DCE. These changes are by no means endorsed by these groups. This is an attempt to revive some of the goals of that group, and the proposal approaches those goals primarily from the Kerberos perspective. 3. Initial authentication of users with public keys This section describes the extensions to Version 5 of the Kerberos protocol that will support the use of public key cryptography by users in the initial request for a ticket granting ticket.This proposal is based on the implementation already made available; nevertheless, we solicit any comments on modifications or additions to the protocol description below.Roughly speaking, the following changes to RFC 1510 are proposed:a. The KDC's response is encryptedUsers can initially authenticate using public key or conventional (symmetric key) cryptography. After arandom nonce key, rather thanKDC compromise, theuser's secret key. b. This random key accompaniesKDC replies with an error message that informs theresponse in a preauthentication field, encrypted and signed usingclient of the new KDC public backup key. Users must authenticate using public keypairs ofcryptography in response to theuser anderror message. If applicable, theKDC. Certificate and message formats are also defined inclient generates the new user secret key at thissection.point as well. Public key initial authentication is performed using either the RSA encryption or Diffie Hellman public key algorithms. There is also an option to allow the user to store his/her private key encrypted in the user password in the KDC database; this option solves the problem of transporting the user private key to different workstations. The combination of this option and the provision for conventional symmetric key authentication allows organizations to smoothly migrate to public key cryptography. This proposal will allow users either to use keys registered directly with the KDC, or to use keys already registered for use with X.509, PEM, or PGP, to obtain Kerberos credentials. These credentials can then be used, as before, with application servers supporting Kerberos. Use of public key cryptography will not be a requirement for Kerberos, but if one's organization runs a KDC supporting public key, then users may choose to be registered with a public key pair, instead of or in addition to the current secret key. The application request and response between Kerberos clients and application servers will continue to be based on conventional cryptography, or will be converted to use user-to-user authentication. There are performance issues and other reasons that servers may be better off using conventional cryptography. For this proposal, we feel that 80 percent of the benefits of integrating public key with Kerberos can be attained for 20 percent of the effort, by addressing only initial authentication. This proposal does not preclude separate extensions. With these changes, users will be able to register public keys, only in realms that support public key,andbut they willthen onlystill be able to perform initial authentication from a client thatsupportsdoes not support publickey, although theykey. They will be able to use services registered in any realm. Furthermore, users registered with conventional keys will be able to use any client. This proposal addresses three ways in which users may use public key cryptography for initial authentication with Kerberos, with minimal change to the existing protocol. Users may register keys directly with the KDC, or they may present certificates by outside certification authorities (or certifications by other users) attesting to the association of the public key with the named user. In both cases, the end result is that the user obtains a conventional ticket granting ticket or conventional server ticket that may be used for subsequent authentication, with such subsequent authentication using only conventional cryptography. Additionally, users may also register a digital signature verification key with the KDC. We provide this option for the licensing benefits, as well as a simpler variant of the initial authentication exchange. However, this option relies on the client to generate random keys. We first consider the case where the user's key is registered with the KDC. 3.1 Definitions Before we proceed, we will lay some groundwork definitions for encryption and signatures. We propose the following definitions of signature and encryption modes (and their corresponding values on the wire): #define ENCTYPE_SIGN_MD5_RSA 0x0011 #define ENCTYPE_ENCRYPT_RSA_PRIV 0x0021 #define ENCTYPE_ENCRYPT_RSA_PUB 0x0022 allowing further modes to be defined accordingly. In the exposition below, we will use the notation E (T, K) to denote the encryption of data T, with key (or parameters) K. If E is ENCTYPE_SIGN_MD5_RSA, then E (T, K) = {T, RSAEncryptPrivate (MD5Hash (T), K)} If E is ENCTYPE_ENCRYPT_RSA_PRIV, then E (T, K) = RSAEncryptPrivate (T, K) Correspondingly, if E is ENCTYPE_ENCRYPT_RSA_PUB, then E (T, K) = RSAEncryptPublic (T, K) 3.2 Initial request for user registered with public key on KDC In this scenario it is assumed that the user is registered with a public key on the KDC. The user's private key may be held by the user, or it may be stored on the KDC, encrypted so that it cannot be used by the KDC. 3.2.1 User's private key is stored locallyIfImplementation of theuser stores his privatechanges in this section is REQUIRED. In this section, we present the basic Kerberos V5 pk-init protocol that all conforming implementations must support. The keylocally,features of theinitial request toprotocol are: (1) easy, automatic (for the clients) recovery after a KDC compromise, (2) the ability for aticket granting ticket proceeds accordingrealm toRFC 1510, except that a preauthentication field containingsupport anonce signed bymix of old and new Kerberos V5 clients with theuser's privatenew clients being a mix of both public keyis included.and symmetric key configured clients, and (3) support for Diffie-Hellman (DH) key exchange as well as RSA public key encryption. Thepreauthentication field may also includebenefit of having new clients being able to use either symmetric key or public key initial authentication is that it allows an organization to roll out the new clients as rapidly as possible without having to be concerned about the need to purchase additional hardware to support the CPU intensive public key cryptographic operations. In order to give alistbrief overview of theroot certifiers trustedfour protocols in this section, we now give diagrams of the protocols. We denote encryption of message M with key K by {M}K and theuser. PA-PK-AS-ROOT ::= SEQUENCE { rootCert[0] SEQUENCE OF OCTET STRING, signedAuth[1] SignedPKAuthenticator } SignedPKAuthenticator ::= SEQUENCE { authent[0] PKAuthenticator, authentSig[1] Signature } PKAuthenticator ::= SEQUENCE { cksum[0]signature of message M with key K by [M]K. All messages from the KDC to the client are AS_REP messages unless denoted otherwise; similarly, all messages from the client to the KDC are AS_REQ messages unless denoted otherwise. Since only the padata fields are affected by this specification in the AS_REQ and AS_REP messages, we do not show the other fields. We first show the RSA encryption option in normal mode: certifier list, [cksum, time, nonce, kdcRealm, kdcName]User PrivateKey C ------------------------------------------------------> KDC list of cert's, {[encReplyKey, nonce]KDC privkey} EncReplyTmpKey, {EncReplyTmpKey}Userpubkey C <------------------------------------------------------ KDC We now show RSA encryption in recovery mode: certifier list, [cksum, time, nonce, kdcRealm, kdcName]User PrivateKey C ------------------------------------------------------> KDC KRB_ERROR (error code KDC_RECOVERY_NEEDED) error data: [nonce, algID (RSA), KDC PublicKey Kvno and PublicKey, KDC Salt] Signed with KDC PrivateKey C <------------------------------------------------------ KDC certifier list, [cksum, time, nonce, kdcRealm, kdcName, {newUserSymmKey, nonce}KDC public key]User PrivateKey C ------------------------------------------------------> KDC list of cert's, {[encReplyKey, nonce]KDC privkey} EncReplyTmpKey, {EncReplyTmpKey}Userpubkey C <------------------------------------------------------ KDC Next, we show Diffie Hellman in normal mode: certifier list, [cksum, time, nonce, kdcRealm, kdcName, User DH public parameter]User PrivateKey C ------------------------------------------------------> KDC list of cert's, {encReplyKey, nonce}DH shared symmetric key, [KDC DH public parameter]KDC Private Key C <------------------------------------------------------ KDC Finally, we show Diffie Hellman in recovery mode: certifier list, [cksum, time, nonce, kdcRealm, kdcName, User DH public parameter]User PrivateKey C ------------------------------------------------------> KDC KRB_ERROR (error code KDC_RECOVERY_NEEDED) error data: [nonce, algID (DH), KDC DH public parameter, KDC DH ID, KDC PublicKey Kvno and PublicKey, KDC Salt] Signed with KDC PrivateKey C <------------------------------------------------------ KDC certifier list, [cksum, time, nonce, kdcRealm, kdcName, User DH public parameter, {newUserSymmKey, nonce}DH shared key, KDC DH ID]User PrivateKey C ------------------------------------------------------> KDC list of cert's, {encReplyKey, nonce}DH shared symmetric key C <------------------------------------------------------ KDC If the user stores his private key locally, the initial request to the KDC for a ticket granting ticket proceeds according to RFC 1510, except that a preauthentication field containing a nonce signed by the user's private key is included. The preauthentication field may also include a list of the root certifiers trusted by the user. PA-PK-AS-ROOT ::= SEQUENCE { rootCert[0] SEQUENCE OF OCTET STRING, signedAuth[1] SignedPKAuthenticator } SignedPKAuthenticator ::= SEQUENCE { authent[0] PKAuthenticator, authentSig[1] Signature } PKAuthenticator ::= SEQUENCE { cksum[0] Checksum OPTIONAL, cusec[1] INTEGER, ctime[2] KerberosTime, nonce[3] INTEGER, kdcRealm[4] Realm, kdcName[5]PrincipalNamePrincipalName, clientPubValue[6] SubjectPublicKeyInfo OPTIONAL, -- DH algorithm recoveryData[7] RecoveryData OPTIONAL -- Recovery Alg. }SignatureRecoveryData ::= SEQUENCE {sigType[0] INTEGER, kvno[1]clientRecovData[0] ClientRecovData, kdcPubValueId[1] INTEGEROPTIONAL, sigHash[2] OCTET STRINGOPTIONAL -- DH algorithm, copied -- from KDC response }Notationally, sigHash is then sigType (authent, userPrivateKey) where userPrivateKey is the user's private key (corresponding to theClientRecovData ::= CHOICE { newPrincKey[0] EncryptedData, -- EncPaPkAsRoot -- encrypted with -- either KDC -- public keyheldor -- DH shared key recovDoneFlag[1] INTEGER -- let KDC know that -- recovery is done -- when user uses a -- mix of clients or -- does not want to -- keep a symmetric -- key in the database } EncPaPkAsRoot ::= SEQUENCE { newSymmKey[0] EncryptionKey -- the principal's new -- symmetric key nonce[1] INTEGER -- the same nonce as -- the one in the -- PKAuthenticator } Signature ::= SEQUENCE { sigType[0] INTEGER, kvno[1] INTEGER OPTIONAL, sigHash[2] OCTET STRING } Notationally, sigHash is then sigType (authent, userPrivateKey) where userPrivateKey is the user's private key (corresponding to the public key held in the user's database record). Valid sigTypes are thus far limited to the above-listed ENCTYPE_SIGN_MD5_RSA; we expect that other types may be listed (and given on-the-wire values between 0x0011 and 0x001f). The format of each certificate depends on the particular service used. (Alternatively, theKDC could send, withKDC could send, with its reply, a sequence of certifications (see below), but since the KDC is likely to have more certifications than users have trusted root certifiers, we have chosen the first method.) In the event that the client believes it already possesses the current public key of the KDC, a zero-length root-cert field is sent. The fields in the signed authenticator are the same as those in the Kerberos authenticator; in addition, we include a client-generated nonce, and the name of the KDC. The structure is itself signed using the user's private key corresponding to the public key registered with the KDC. We include the newSymmKey field so clients can generate a new symmetric key (for users, this key is based on a password and a salt value generated by the KDC) and confidentially send this key to the KDC during the recovery phase. We now describe the recovery phase of the protocol. There is a bit associated with each principal in the database indicating whether recovery for that principal is necessary. After a KDC compromise, the KDC software is reloaded from backup media and a new backup KDC public/private pair is generated. The public half of this pair is then either made available to the KDC, or given to the appropriate certification authorities for certification. The private half is not made available to the KDC until after the next compromise clean-up. If clients are maintaining a copy of the KDC public key, they also have a copy of the backup public key. After the reload of KDC software, the bits associated with recovery of each principal are all set. The KDC clears the bit for each principal that undergoes the recovery phase. In addition, there is a bit associated with each principal to indicate whether there is a valid symmetric key in the database for the principal. These bits are all cleared after the reload of the KDC software (the old symmetric keys are no longer valid). Finally, there is a bit associated with each principal indicating whether that principal still uses non-public key capable clients. If a user principal falls into this category, a public key capable client cannot transparently re-establish a symmetric key for that user, since the older clients would not be able to compute the new symmetric key that includes hashing the password with a KDC supplied salt value. The re-establishment of the symmetric key in this case is outside the scope of this protocol. One method of re-establishing a symmetric key for public key capable clients is to generate a hash of the user password and a KDC supplied salt value. The KDC salt is changed after every compromise of the KDC. In the recovery protocol, if the principal does not still use old clients, the KDC supplied salt is sent to the client principal in a KRB_ERROR message with error code KDC_RECOVERY_NEEDED. The error data field of the message contains the following structure which is encoded into an octet string. PA-PK-KDC-ERR ::= CHOICE { recoveryDhErr SignedDHError, -- Used during recovery -- when algorithm is DH -- based recoveryPKEncErr SignedPKEncError -- Used during recovery -- for PK encryption -- (RSA,...) } SignedDHError ::= SEQUENCE { dhErr DHError, dhErrSig Signature } SignedPKEncError ::= SEQUENCE { pkEncErr PKEncryptError, pkEncErrSig Signature } DHError ::= SEQUENCE { nonce INTEGER, -- From AS_REQ algorithmId INTEGER, -- DH algorithm kdcPubValue SubjectPublicKeyInfo, -- DH algorithm kdcPubValueId INTEGER, -- DH algorithm kdcPublicKeyKvno INTEGER OPTIONAL, -- New KDC public -- key kvno kdcPublicKey OCTET STRING OPTIONAL, -- New KDC pubkey kdcSalt OCTET STRING OPTIONAL -- If user uses -- only new -- clients } PKEncryptError ::= SEQUENCE { nonce INTEGER, -- From AS_REQ algorithmId INTEGER, -- Public Key -- encryption alg kdcPublicKeyKvno INTEGER OPTIONAL, -- New KDC public -- key kvno kdcPublicKey OCTET STRING OPTIONAL, -- New KDC public -- key kdcSalt OCTET STRING OPTIONAL -- If user uses -- only new -- clients } The KDC_RECOVERY_NEEDED error message is sent in response to a client AS_REQ message if the client principal needs to be recovered, unless the client AS_REQ contains the PKAuthenticator with a nonempty RecoveryData field (in this case the client has already received the KDC_RECOVERY_NEEDED error message. We will also see in section 3.2.2 that a different error response is sent by the KDC if the encrypted user private key is stored in the KDC database.) If the client principal uses only new clients, then the kdcSalt field is returned; otherwise, the kdcSalt field is absent. If the client uses the Diffie Hellman algorithm during the recovery phase then the DHError field contains the public Diffie Hellman parameter (kdcPubValue) for the KDC along with an identifier (kdcPubValueID). The client will then send this identifier to the KDC in an AS_REQ message; the identifier allows the KDC to look up the Diffie Hellman private value corresponding to the identifier. Depending on how often the KDC updates its private Diffie Hellman parameters, it will have to store anywhere between a handful and several dozen of these identifiers and their parameters. The KDC must send its Diffie Hellman public value to the client first so the client can encrypt its new symmetric key. In the case where the user principal does not need to be recovered and the user still uses old clients as well as new clients, the KDC_ERR_NULL_KEY error is sent in response to symmetric AS_REQ messages when there is no valid symmetric key in the KDC database. This situation can occur if the user principal has been recovered but no new symmetric key has been established in the database. In addition, the two error messages with error codes KDC_ERR_PREAUTH_FAILED and KDC_ERR_PREAUTH_REQUIRED are modified so the error data contains the kdcSalt encoded as an OCTET STRING. The reason for the modification is to allow principals that use new clients only to have their symmetric key transparently updated by the client software during the recovery phase. The kdcSalt is used to create the new symmetric key. As a performance optimization, the kdcSalt is stored in the /krb5/salt file along with the realm. Thus the /krb5/salt file consists of realm-salt pairs. If the file is missing, or the salt is not correct, the above error messages allow the client to find out the correct salt. New clients which are configured for symmetric key authentication attempt to preauthenticate with the salt from the /krb5/salt file as an input into their key, and if the file is not present, the new client does not use preauthentication. The error messages above return either the correct salt to use, or no salt at all which indicates that the principal is still using old clients (the client software should use the existing mapping from the user password to the symmetric key). In order to assure interoperability between clients from different vendors and organizations, a standard algorithm is needed for creating the symmetric key from the principal password and kdcSalt. The algorithm for creating the symmetric key is as follows: take the SHA-1 hash of the kdcSalt concatenated with the principal password and use the 20 byte output as the input into the existing key generation process (string to key function). After a compromise, the KDC changes the kdcSalt; thus, the recovery algorithm allows users to obtain a new symmetric key without actually changing their password. The response from the KDC would be identical to the response in RFC 1510, except that instead of being encrypted in the secret key shared by the client and the KDC, it is encrypted in a random key freshly generated by the KDC (of type ENCTYPE_ENC_CBC_CRC). A preauthentication field (specified below) accompanies the response, optionally containing a certificate with the public key for the KDC (since we do not assume that the client knows this public key), and a package containing the secret key in which the rest of the response is encrypted, along with the same nonce used in the rest of the response, in order to prevent replays. This package is itself signed with the private key of the KDC, then encrypted with the symmetric key that is returned encrypted in the public key of the user (or for Diffie Hellman, encrypted in the shared secret Diffie Hellman symmetric key). Pictorially, in the public key encryption case we have: kdcCert, {[encReplyKey, nonce] Sig w/KDC privkey}EncReplyTmpKey, {EncReplyTmpKey}Userpubkey Pictorially, in the Diffie Hellman case we have: kdcCert, {encReplyKey, nonce}DH shared symmetric key, [DH public value]Sig w/KDC privkey PA-PK-AS-REP ::= SEQUENCE { kdcCert[0] SEQUENCE OF Certificate, encryptShell[1] EncryptedData, -- EncPaPkAsRepPartShell -- encrypted by -- encReplyTmpKey or DH -- shared symmetric key pubKeyExchange[2] PubKeyExchange OPTIONAL, -- a choice between -- a KDC signed DH -- value and a public -- key encrypted -- symmetric key. -- Not needed after -- recovery when -- DH is used. } PubKeyExchange ::= CHOICE { signedDHPubVal SignedDHPublicValue, encryptKey EncryptedData -- EncPaPkAsRepTmpKey -- encrypted by -- userPublicKey } SignedDHPublicValue ::= SEQUENCE { dhPublic[0] SubjectPublicKeyInfo, dhPublicSig[1] Signature } EncPaPkAsRepPartShell ::= SEQUENCE { encReplyPart[0] EncPaPkAsRepPart, encReplyPartSig[1] Signature OPTIONAL -- encReplyPart -- signed by kdcPrivateKey -- except not present in -- DH case } EncPaPkAsRepPart ::= SEQUENCE { encReplyKey[0] EncryptionKey, nonce[1] INTEGER, } EncPaPkAsRepTmpKey ::= SEQUENCE { encReplyTmpKey[0] EncryptionKey } The kdc-cert specification is lifted, with slight modifications, from v3 of the X.509 certificate specification: Certificate ::= SEQUENCE { version[0] Version DEFAULT v1 (1), serialNumber[1] CertificateSerialNumber, signature[2] AlgorithmIdentifier, issuer[3] PrincipalName, validity[4] Validity, subjectRealm[5] Realm, subject[6] PrincipalName, subjectPublicKeyInfo[7] SubjectPublicKeyInfo, issuerUniqueID[8] IMPLICIT UniqueIdentifier OPTIONAL, subjectUniqueID[9] IMPLICIT UniqueIdentifier OPTIONAL, authentSig[10] Signature } The kdc-cert must have as its root certification one of the certifiers sent to the KDC with the original request. If the KDC has no such certification, then it will instead reply with a KRB_ERROR of type KDC_ERROR_PREAUTH_FAILED. If a zero-length root-cert was sent by the client as part of the PA-PK-AS-ROOT, then a correspondingly zero-length kdc-cert may be absent, in which case the client uses its copy of the KDC's public key. In the case of recovery, the client uses itsreply, a sequencecopy ofcertifications (see below), but sincethe backup KDCis likely to have more certifications than users have trusted root certifiers, we have chosenpublic key. Upon receipt of thefirst method.) Inresponse from theevent thatKDC, the clientbelieves it already possesseswill verify thecurrentpublic keyoffor theKDC, a zero-length root-cert field is sent.KDC from PA-PK-AS-REP preauthentication data field. Thefields in the signed authenticator arecertificate must certify thesamekey asthose in the Kerberos authenticator; in addition, we includebelonging to aclient- generated nonce,principal whose name can be derived from the realm name. If the certificate checks out, the client then decrypts the EncPaPkAsRepPart and verifies thenamesignature of the KDC.The structure is itself signed usingIt then uses theuser's privaterandom keycorrespondingcontained therein to decrypt thepublic key registered withrest of theKDC. Typically, preauthentication using a secret key would not be included, but if included it may be ignored byresponse, and continues as per RFC 1510. Because there is direct trust between theKDC. (We recommend that it not be included: even ifuser and the KDC, the transited field of the ticket returned by the KDC shouldignoreremain empty. (Cf. Section 3.3.) Examples We now give several examples illustrating thepreauthentication, an attacker may not,protocols in this section. Encryption of message M with key K is denoted {M}K anduse an interceptedthe signature of message M with key K is denoted [M]K. Example 1: The requesting user principal needs toguess the password off-line.)be recovered and uses only new clients. Theresponse fromrecovery algorithm is Diffie Hellman (DH). Then theKDC would be identical toexchange sequence between theresponse in RFC 1510, except that instead of being encrypted inuser principal and thesecret key shared byKDC is: Client --------> AS_REQ (with or without preauth) --------> KDC Client <--- KRB_ERROR (error code KDC_RECOVERY_NEEDED) <--- KDC error data: [nonce, algID (DH), KDC DH public parameter, KDC DH ID, KDC PublicKey Kvno and PublicKey, KDC Salt]Signed with KDC PrivateKey At this point, the clientandvalidates theKDC, itKDC signature, checks to see if the nonce isencryptedthe same as the one ina random key freshly generated bytheKDC (of type ENCTYPE_ENC_CBC_CRC). A preauthentication field (specified below) accompaniesAS_REQ, and stores theresponse, optionally containingnew KDC public key and public key version number. The client then generates acertificate withDiffie Hellman private parameter and computes the corresponding Diffie Hellman public parameter; the client also computes the shared Diffie Hellman symmetric keyforusing the KDC(since we do not assume that the client knows thisDiffie Hellman publickey),parameter anda package containingits own Diffie Hellman private parameter. Next, thesecret key in whichclient prompts therest ofuser for his/her password (if it does not already have theresponsepassword). The password isencrypted, alongconcatenated with thesame nonce used in the rest ofKDC Salt and then SHA1 hashed; theresponse, in order to prevent replays. This packageresult isitself encrypted withfed into theprivatestring to keyoffunction to obtain theKDC, thennew user DES key. The new user DES key will be encrypted (along with thepublicAS_REQ nonce) using the Diffie Hellman symmetric keyofand sent to theuser. PA-PK-AS-REP ::= SEQUENCE { kdcCert[0] SEQUENCE OF Certificate, encryptShell[1] EncryptedData, -- EncPaPkAsRepPartShell -- encrypted by encReplyTmpKey encryptKey[2] EncryptedData -- EncPaPkAsRepTmpKey -- encrypted by userPubliKey } EncPaPkAsRepPartShell ::= SEQUENCE { encReplyPart[0] EncPaPkAsRepPart, encReplyPartSig[1] Signature -- encReplyPart -- signed by kdcPrivateKey } EncPaPkAsRepPart ::= SEQUENCE { encReplyKey[0] EncryptionKey, nonce[1] INTEGER } EncPaPkAsRepTmpKey ::= SEQUENCE { encReplyTmpKey[0] EncryptionKey } Notationally, assume that encryptPack is encrypted (or signed)KDC in the new AS_REQ message: Client -> AS_REQ withalgorithm Ak, and that encryptShell is encryptedpreauth: rootCert, [PKAuthenticator withalgorithm Au. Then, encryptShell is Au (Ak ({encReplyKey, nonce}, kdcPrivateKey), userPublicKey) where kdcPrivateKeyuser DH public parameter, {newUser DES key, nonce}DH symmetric key, KDC DH ID]Signed with User PrivateKey -> KDC The KDC DH ID is copied by the client from the KDC_ERROR message received above. Upon receipt and validation of this message, theKDC'sKDC first uses the KDC DH ID as an index to locate its privatekey, and userPublicKey isDiffie Hellman parameter; it uses this parameter in combination with theuser'suser public Diffie Hellman parameter to compute the symmetric Diffie Hellman key. Thekdc-cert specificationKDC checks if the encrypted nonce islifted, with slight modifications, from v3 oftheX.509 certificate specification: Certificate ::= SEQUENCE { version[0] Version DEFAULT v1 (1), serialNumber[1] CertificateSerialNumber, signature[2] AlgorithmIdentifier, issuer[3] PrincipalName, validity[4] Validity, subjectRealm[5] Realm, subject[6] PrincipalName, subjectPublicKeyInfo[7] SubjectPublicKeyInfo, issuerUniqueID[8] IMPLICIT UniqueIdentifier OPTIONAL, subjectUniqueID[9] IMPLICIT UniqueIdentifier OPTIONAL, authentSig[10] Signature } The kdc-cert must havesame asits root certificationthe oneofin thecertifiers sent toPKAuthenticator and the AS_REQ part. The KDCwiththen enters theoriginal request. Ifnew user DES key into the database, resets the recovery needed bit, and sets the valid symmetric key in database bit. The KDChas no such certification,thenit will instead replycreates the AS_REP message: Client <-- AS_REP with preauth: kdcCert, {encReplyKey, nonce}DH symmetric key <-------------------- KDC The AS_REP encrypted part is encrypted with the encReplyKey that is generated on the KDC. The nonces are copied from the client AS_REQ. The kdcCert is aKRB_ERRORsequence oftype KDC_ERROR_PREAUTH_FAILED. If a zero-length root-cert was sentcertificates that have been certified by certifiers listed in the clientas part of the PA-PK-AS-ROOT, thenrootCert field, unless acorrespondingly zero-length kdc-cert may be absent, in which casezero length rootCert field was sent. In theclient uses its copy oflast case, theKDC's public key. Upon receiptkdcCert will also have zero length. 3.2.2. Private key held by KDC Implementation of theresponse fromchanges in this section is RECOMMENDED. When theKDC,user's private key is not carried with theclient will verifyuser, thepublicuser may encrypt the private keyforusing conventional cryptography, and register theKDC from PA-PK-AS-REP preauthentication data field, The certificate must certifyencrypted private key with the KDC. As described in thekey as belonging to a principal whose name can be derived fromprevious section, therealm name. IfSHA1 hash of thecertificate checks out,password concatenated with theclient then decryptskdcSalt is also stored in theEncPaPkAsRepPartKDC database if the user only uses new clients. We restrict users of this protocol to using new clients only. The reason for this restriction is that it is not secure to store both the user private keyofencrypted in theuser,user's password andverifiesthesignature ofuser password on theKDC. It then usesKDC simultaneously. There are several options for storing private keys. If therandomuser stores their private keycontained thereinon a removable disk, it is less convenient since they need todecryptalways carry therest ofdisk around with them; in addition, theresponse, and continues as per RFC 1510. Because there is direct trustprocedures for extracting the key may vary between different operating systems. Alternatively, the userand the KDC,can store a private key on thetransited fieldhard disks of systems that he/she uses; besides limiting theticket returned bysystems that theKDC should remain empty. (Cf. Section 3.3.) 3.2.2. Privateuser can login from there is also a greater security risk to the private key. If smart card readers or slots are deployed in an organization, then the user can store his/her private keyheld by KDC Implementation ofon a smart card. Finally, thechangesuser can store his/her private key encrypted inthis sectiona password on the KDC. This last option isOPTIONAL.probably the most practical option currently; it is important that a good password policy be used. When the user's private key isnot carried with the user, thestored on the KDC, preauthentication is required. There are two cases depending on whether the requesting user principal needs to be recovered. In order to obtain its private key, a user principal includes the padata type PA-PK-AS-REQ in the preauthentication data field of the AS_REQ message. The accompanying pa-data field is: PA-PK-AS-REQ ::= SEQUENCE { algorithmId[0] INTEGER, -- Public Key Alg. encClientPubVal[1] EncryptedData -- EncPaPkAsReqDH -- (encrypted with key -- K1) } EncPaPkAsReqDH ::= SEQUENCE { clientPubValue[0] SubjectPublicKeyInfo } Pictorially, PA-PK-AS-REQ is algorithmID, {clientPubValue}K1. The usermay encrypt the private key using conventional cryptography, and register theprincipal sends its Diffie-Hellman public value encryptedprivate key within theKDC.key K1. TheMD5 hash of the DESkeyusedK1 is derived by performing string toencrypt the privatekeymust also be registered withon theKDC. We provide this optionSHA1 hash of the user password concatenated with thewarning that storingkdcSalt which is stored in theprivate key on/krb5/salt file. If theKDC carriesfile is absent, therisk of exposureconcatenation step is skipped incasetheKDC is compromised. If a suffiently good password is chosen to encryptabove algorithm. The Diffie Hellman parameters g and p are implied by thekey, then this passwordalgorithmID field. By choosing g and p correctly, dictionary attacks against the key K1 can beused for a limited time to change the private key.made more difficult [Jaspan]. If the requesting userwishes to authenticate himself without storingprincipal needs recovery, the encrypted user private keyon each local disk, then a safer, albeit possibly less practical, alternativeisto use a smart card to storestored in thekeys. WhenKDC database, and theuser's private keyAS_REQ RecoveryData field isstored onnot present in theKDC,PKAuthenticator, then the KDCrecord will also indicate whether preauthentication is required before returningreplies with a KRB_ERROR message, with msg-type set to KDC_ERR_PREAUTH_REQUIRED, and e-data set to: PA-PK-AS-INFO ::= SEQUENCE { signedDHErr SignedDHError, -- signed by KDC encUserKey OCTET STRING OPTIONAL -- encrypted by -- user password -- key; (recovery -- response) } The user principal should then continue with thekey (we recommendsection 3.2.1.1 protocol using the Diffie Hellman algorithm. We now assume thatit be required). If such preauthentication is required, whentheinitialrequesting user principal does not need recovery. Upon receipt of the authentication requestis received,with the PA-PK-AS-REQ, the KDCwill respond withgenerates the AS response as defined in RFC 1510, but additionally includes aKRB_ERROR message, with msg-type set to KDC_ERR_PREAUTH_REQUIRED, and e-data set to: PA-PK-AS-INFOpreauthentication field of type PA-PK-USER-KEY. PA-PK-USER-KEY ::= SEQUENCE {kdcCert[0]kdcCert SEQUENCE OFCertificateCertificate, encUserKeyPart EncryptedData, -- EncPaPkUserKeyPart kdcPrivKey KDCPrivKey, kdcPrivKeySig Signature } The kdc-cert field is identical to that in the PA-PK-AS-REP preauthentication data field returned with the KDC response, and must be validated as belonging to the KDC in the same manner.Upon receiptKDCPrivKey ::= SEQUENCE { nonce INTEGER, -- From AS_REQ algorithmId INTEGER, -- DH algorithm kdcPubValue SubjectPublicKeyInfo, -- DH algorithm kdcSalt OCTET STRING -- Since user -- uses only new -- clients } The KDCPrivKey field is signed using the KDC private key. The encrypted part of theKRB_ERRORAS_REP messagewith a PA-PK-AS-INFO field,is encrypted using theclient will promptDiffie Hellman derived symmetric key, as is theuser forEncPaPkUserKeyPart. EncPaPkUserKeyPart ::= SEQUENCE { encUserKey OCTET STRING, nonce INTEGER -- From AS_REQ } Notationally, if encryption algorithm A is used, then enc-key-part is A ({encUserKey, nonce}, Diffie-Hellman-symmetric-key). If thepassword that wasclient has used an incorrect kdcSalt toencrypt the private key, derivecompute theDESkey K1, then the client needs to resubmit the above AS_REQ message using the correct kdcSalt field from the KDCPrivKey field. This message contains the encrypted private key thatpassword,has been registered with the KDC by the user, as encrypted by the user, super-encrypted with the Diffie Hellman derived symmetric key. Because there is direct trust between the user and the KDC, the transited field of the ticket returned by the KDC should remain empty. (Cf. Section 3.3.) Examples We now give several examples illustrating the protocols in this section. Example 1: The requesting user principal needs to be recovered and stores his/her encrypted private key on the KDC. Then the exchange sequence between the user principal and the KDC is: Client --------> AS_REQ (with or without preauth) -----> KDC Client <--- KRB_ERROR (error code KDC_ERR_PREAUTH_REQUIRED) error data: [nonce, algID (DH), KDC DH public parameter, KDC DH ID, KDC PublicKey Kvno and PublicKey, KDC Salt]Signed with KDC PrivateKey, {user private key}user password <------------- KDC The protocol now continues with the second AS_REQ as in Example 1 of section 3.2.1.1. Example 2: The requesting user principal does not need to be recovered andcalculatestores his/her encrypted private key on theMD5 hash H1 ofKDC. Then theDES key. The client then sends a request toexchange sequence between theKDC, which includes a timestampuser principal anda client-generated random secret key that will be used bythe KDCto super-encryptwhen theencrypteduser principal wants to obtain his/her private keybefore it is returned to the client. This information is sent to the KDC in a subsequentis: Client -> AS_REQmessage in a preauthentication data field: PA-PK-AS-REQ ::= SEQUENCE { encHashShell[0] EncryptedData -- EncPaPkAsReqShell } EncPaPkAsReqShell ::= SEQUENCE { encHashPart[0] EncryptedData -- EncPaPkAsReqPart } EncPaPkAsReqPart ::= SEQUENCE { encHashKey[0] EncryptionKey, nonce[1] INTEGER } The EncPaPkAsReqPart is first encryptedwitha DESpreauth: algID, {DH public parameter}K1 -> KDC The keyK1, derivedK1 is generated bystring_to_key fromusing the string to key function on the SHA1 hashH1 (with null salt), then encrypted againof the password concatenated with theKDC's public keykdcSalt from thecertificate in the PA-PK-AS-INFO field of/krb5/salt file. If theerror response. Notationally, if encryption algorithm Afile isused for DES encryption, and Ak is used for the public key encryption,absent, thenenc-shell is Ak (A ({encHashKey, nonce}, K1), kdcPublicKey) Upon receipt of the authentication request withthePA-PK-AS-REQ,concatenation step is skipped, and theKDC verifiesclient will learn thehash ofcorrect kdcSalt in theuser's DES encryption key by attempting to decryptfollowing AS_REP message from theEncPaPkAsReqPartKDC. The algID should indicate some type ofthe PA-PK-AS-REQ. If decryption is successful, theDiffie Hellman algorithm. The KDCgeneratesreplies with theAS response as defined in RFC 1510, but additionally includesAS_REP message with a preauthenticationfield of type PA-PK-USER-KEY. (This response will also be includeddata field: Client <-- AS_REP with preauth: kdcCert, {encUserKey, <-- KDC nonce}DH symmetric key, [nonce, algID, DH public parameter, kdcSalt]KDC privateKey The client validates the KDC's signature and checks that the nonce matches the nonce inresponse toits AS_REQ message. If theinitial request without preauthentication if preauthentication iskdcSalt does notrequired formatch what theuser andclient used, it starts theuser's encryptedprotocol over. The client then uses the KDC Diffie Hellman public parameter along with its own Diffie Hellman private parameter to compute the Diffie Hellman symmetric key. This key isstored onused to decrypt theKDC.) PA-PK-USER-KEY ::= SEQUENCE { encUserKeyPart[0] EncryptedData -- EncPaPkUserKeyPart } EncPaPkUserKeyPart ::= SEQUENCE { encUserKey[0] OCTET STRING, nonce[1] INTEGER } Notationally,encUserKey field; the client checks ifencryption algorithm A is used, then enc-key-partthe nonce matches its AS_REQ nonce. At this point, the initial authentication protocol isA ({encUserKey, nonce}, enc-hash-key) (where A couldcomplete. Example 3: The requesting user principal does not need to benull encryption). This message contains therecovered and stores his/her encrypted private keythat has been registered withon theKDC byKDC. In this example, theuser, as encrypted byuser principal uses theuser, optionally super-encrypted withconventional symmetric key Kerberos V5 initial authentication protocol exchange. We note that theenc-hash-key fromconventional protocol exposes thePA-PK-AS-REQ message if preauthentication using that method was provided (otherwise,user password to dictionary attacks; therefore, theEncryptedData should denote null encryption). Note that since H1 is a one-way hash, ituser password must be changed more often. An example of when this protocol would be used is when new clients have been installed but an organization has notpossiblephased in public key authentication foroneall clients due todecrypt the message if one possesses H1 but not the DESperformance concerns. Client ----> AS_REQ with preauthentication: {time}K1 --> KDC Client <-------------------- AS_REP <------------------ KDC The keythat H1K1 is derivedfrom. Because there is direct trust between the user and the KDC, the transited field of the ticket returned byas in theKDC should remain empty. (Cf. Section 3.3.)preceding two examples. 3.3. Clients with a public key certified by an outside authority Implementation of the changes in this section is OPTIONAL. In the case where the client is not registered with the current KDC, the client is responsible for obtaining the private key on its own. The client will request initial tickets from the KDC using the TGS exchange, but instead of performingpre-authenticationpreauthentication using a Kerberos ticket granting ticket, or with the PA-PK-AS-REQ that is used when the public key is known to the KDC, the client performs preauthentication using the preauthentication data field of type PA-PK-AS-EXT-CERT: PA-PK-AS-EXT-CERT ::= SEQUENCE { userCert[0] SEQUENCE OF OCTET STRING, signedAuth[1] SignedPKAuthenticator } where the user-cert specification depends on the type of certificate that the user possesses. In cases where the service has separate key pairs for digital signature and for encryption, we recommend that the signature keys be used for the purposes of sending the preauthentication (and deciphering the response). The authenticator is the one used from the exchange in section 3.2.1, except that it is signed using the private key corresponding to the public key in the user-cert. The KDC will verify the preauthentication authenticator, and check the certification path against its own policy of legitimate certifiers. This may be based on a certification hierarchy, or simply a list of recognized certifiers in a system like PGP. If all checks out, the KDC will issue Kerberos credentials, as in 3.2, but with the names of all the certifiers in the certification path added to the transited field of the ticket, with a principal name taken from the certificate (this might be a long path for X.509, or a string like "John Q. Public <jqpublic@company.com>" if the certificate was a PGP certificate. The realm will identify the kind of certificate and the final certifier as follows: cert_type/final_certifier as in PGP/<endorser@company.com>. 3.4. Digital Signature Implementation of the changes in this section is OPTIONAL. We offer this option with the warning that it requires the client process to generate a random DES key; this generation may not be able to guarantee the same level of randomness as the KDC. If a user registered a digital signature key pair with the KDC, a separate exchange may be used. The client sends a KRB_AS_REQ as described in section 3.2.2. If the user's database record indicates that a digital signature key is to be used, then the KDC sends back a KRB_ERROR as in section 3.2.2. It is assumed here that the signature key is stored on local disk. The client generates a random key of enctype ENCTYPE_DES_CBC_CRC, signs it using the signature key (otherwise the signature is performed as described in section 3.2.1), then encrypts the whole with the public key of the KDC. This is returned with a separate KRB_AS_REQ in a preauthentication of type PA-PK-AS-SIGNED ::= SEQUENCE { signedKey[0] EncryptedData -- PaPkAsSignedData } PaPkAsSignedData ::= SEQUENCE { signedKeyPart[0] SignedKeyPart, signedKeyAuth[1]PKAuthenticatorPKAuthenticator, sig[2] Signature } SignedKeyPart ::= SEQUENCE { encSignedKey[0] EncryptionKey, nonce[1] INTEGER } where the nonce is the one from the request. Upon receipt of the request, the KDC decrypts, then verifies the random key. It then replies as per RFC 1510, except that instead of being encrypted with the password-derived DES key, the reply is encrypted using the randomKey sent by the client. Since the client already knows this key, there is no need to accompany the reply with an extra preauthentication field. Because there is direct trust between the user and the KDC, the transited field of the ticket returned by the KDC should remain empty. (Cf. Section 3.3.) In the event that the KDC database indicates that the user principal must be recovered, and the PKAuthenticator does not contain the RecoveryData field, the KDC will reply with the KDC_RECOVERY_NEEDED error. The user principal then sends another AS_REQ message that includes the RecoveryData field in the PKAuthenticator. The AS_REP message is the same as in the basic Kerberos V5 protocol. 4. Preauthentication Data Types We propose that the following preauthentication types be allocated for the preauthentication data packages described in this draft: #define KRB5_PADATA_ROOT_CERT 17 /* PA-PK-AS-ROOT */ #define KRB5_PADATA_PUBLIC_REP 18 /* PA-PK-AS-REP */ #define KRB5_PADATA_PUBLIC_REQ 19 /* PA-PK-AS-REQ */ #define KRB5_PADATA_PRIVATE_REP 20 /* PA-PK-USER-KEY */ #define KRB5_PADATA_PUBLIC_EXT 21 /* PA-PK-AS-EXT-CERT */ #define KRB5_PADATA_PUBLIC_SIGN 22 /* PA-PK-AS-SIGNED */ 5. Encryption Information For the public key cryptography used in direct registration, we used (in our implementation) the RSAREF library supplied with the PGP 2.6.2 release. Encryption and decryption functions were implemented directly on top of the primitives made available therein, rather than the fully sealing operations in the API. 6. Compatibility with One-Time Passcodes We solicit discussion on how the use of public key cryptography for initial authentication will interact with the proposed use of one time passwords discussed in Internet Draft <draft-ietf-cat-kerberos-passwords-00.txt>. 7. Strength of Encryption and Signature Mechanisms In light of recent findings on the strengths of MD5 and various DES modes, we solicit discussion on which modes to incorporate into the protocol changes. 8. Expiration This Internet-Draft expires onDecember 7, 1996.April 19, 1997. 9. Authors' Addresses B. Clifford Neuman USC/Information Sciences Institute 4676 Admiralty Way Suite 1001 Marina del Rey, CA 90292-6695 Phone: 310-822-1511 EMail: bcn@isi.edu Brian Tung USC/Information Sciences Institute 4676 Admiralty Way Suite 1001 Marina del Rey, CA 90292-6695 Phone: 310-822-1511 EMail: brian@isi.edu John Wray Digital Equipment Corporation 550 King Street, LKG2-2/Z7 Littleton, MA 01460 Phone: 508-486-5210 EMail: wray@tuxedo.enet.dec.com Jonathan Trostle CyberSafe Corporation 1605 NW Sammamish Rd., Suite 310 Issaquah, WA 98027-5378 Phone: 206-391-6000 EMail: jonathan.trostle@cybersafe.com ----